跳轉至

數據來源型別

執行模型

每一則查詢最終均經由聯邦引擎執行,該引擎為所有數據來源提供聯邦能力。數據來源依其連線方式分為三大類。[tool-verified: provisa/core/models.py lines 84–132] (REQ-550)

類別 具備直接驅動程式 具備聯邦連接器 範例
可直連型 PostgreSQL、MySQL、MariaDB、SingleStore、SQL Server、Oracle、DuckDB
僅限聯邦型 Redshift、Druid、Exasol、Hive、Iceberg、Delta Lake、Hive(S3 支援)
直讀(複本)型 Snowflake、Databricks、ClickHouse——驅動程式讀取數據並落地為複本;查詢於使用中引擎的複本上執行
具體化 → 聯邦型 REST/OpenAPI、遠端 GraphQL、gRPC、Neo4j Cypher、SPARQL、WebSocket、RSS、CSV、SQLite、Parquet、Ingest(推送接收端)、GovData、SharePoint、Splunk

可直連型數據來源會經由其原生驅動程式執行單一數據來源查詢(低於 100 毫秒),略過聯邦引擎 (REQ-027REQ-229)。這類數據來源保留完整的連接器支援,並於與其他數據來源進行 JOIN 時參與聯邦 (REQ-028)。

僅限聯邦型數據來源恆經聯邦層查詢。並無直接驅動程式存在 (REQ-229)。

直讀(複本)型數據來源具備一個 DirectDriver,會原生讀取該數據倉庫(有支援時採用 Arrow 原生格式),將複本落地至使用中引擎的具體化儲存區,隨後查詢即於該複本上執行。見作為具名數據來源的數據倉庫

具體化型數據來源並無聯邦連接器。Provisa 會擷取其數據(於啟動時或查詢時),並以 Parquet 格式快取於 S3 或 PostgreSQL 中,使聯邦引擎可存取其進行跨數據來源查詢 (REQ-309)。


所有數據來源

Provisa 支援的每種數據來源型別參考。「直接驅動程式」表示單一數據來源查詢會原生針對該數據來源執行(低於 100 毫秒)(REQ-027)。「連接器名稱」是當該數據來源參與多數據來源 JOIN 時所使用的聯邦連接器 (REQ-028)。[tool-verified: provisa/core/source_registry.py SOURCE_TO_DIALECT; provisa/federation/trino_connectors.py trino_connector_name]

RDBMS

數據來源型別 直接驅動程式 連接器名稱 方言 變異
postgresql asyncpg postgresql postgres 支援
mysql aiomysql mysql mysql 支援
mariadb aiomysql mariadb mysql 支援
singlestore singlestore singlestore 聯邦式
sqlserver aioodbc sqlserver tsql 支援
oracle oracledb oracle oracle 支援
duckdb duckdb memory duckdb 支援
cockroachdb asyncpg(PG wire) postgresql postgres 支援
yugabytedb asyncpg(PG wire) postgresql postgres 支援
greenplum asyncpg(PG wire) postgresql postgres 支援
tidb aiomysql(MySQL wire) mysql mysql 支援

線路相容的資料庫會重用某基礎線路的 JDBC 驅動程式、原生非同步驅動程式及方言——CockroachDB、YugabyteDB 及 Greenplum 搭乘 PostgreSQL 線路;TiDB 搭乘 MySQL 線路。它們僅需登記項目,無須新增連接器程式碼。[tool-verified: provisa/core/source_registry.py _PG_WIRE_TYPES, _MYSQL_WIRE_TYPES] (REQ-950)

firebird(Firebird 3/4/5)及 airport(Arrow Flight 伺服器)為已註冊的數據來源型別,於 DuckDB 為使用中引擎時,透過 DuckDB 社群擴充功能就地連接——無直接驅動程式,無聯邦連接器。[tool-verified: provisa/core/models.py lines 44, 93] (REQ-899)

雲端數據倉庫

[tool-verified: executor/drivers/snowflake.py, executor/drivers/databricks.py, executor/drivers/registry.py]

數據來源型別 直接驅動程式 連接器名稱 方言 變異 備註
snowflake SnowflakeDriver snowflake snowflake 聯邦式 透過 snowflake-connector-python 讀取;落地複本;federation_hints 中須含 account/warehouse/role (REQ-988)
bigquery bigquery bigquery 聯邦式 無 DirectDriver;透過聯邦引擎或 BigQuery 引擎 ATTACH 連接
databricks DatabricksDriver delta_lake databricks 聯邦式 透過 databricks-sql-connector 讀取(Cloud Fetch、Arrow);落地複本;federation_hints 中須含 http_path (REQ-987)
redshift redshift redshift 聯邦式
fabric MssqlWarehouseDriver tsql 聯邦式 Microsoft Fabric Warehouse;透過 TDS 使用 T-SQL,Azure AD 驗證;落地複本 (REQ-995)
synapse MssqlWarehouseDriver tsql 聯邦式 Azure Synapse SQL;透過 TDS 使用 T-SQL,Azure AD 驗證;落地複本 (REQ-995)
trino SQLAlchemyDriver 聯邦式 透過 SQLAlchemy trino 方言讀取遠端 Trino/Presto 協調器;於任何引擎上落地複本 (REQ-994)

分析 / OLAP

[tool-verified: executor/drivers/clickhouse.py]

數據來源型別 直接驅動程式 連接器名稱 方言 變異 備註
clickhouse ClickHouseDriver clickhouse clickhouse 聯邦式 透過 clickhouse-connect(HTTP)讀取;federation_hints 中的 secure: "true" 用於 TLS (REQ-986)
druid druid druid 不支援
exasol exasol exasol 不支援
elasticsearch elasticsearch 不支援 連接器屬性來自該型別的對應 DSL [tool-verified: trino_connectors.py:309]
pinot pinot 不支援 Trino pinot 連接器;pinot.controller-urls = Pinot 控制器的 host:port [tool-verified: trino_connectors.py:199]

數據湖 / 開放資料表格式

這些數據來源型別為僅限聯邦——無直接驅動程式,無方言。[tool-verified: LAKE_ONLY_SOURCES in provisa/core/source_registry.py] (REQ-229)

數據來源型別 連接器名稱 時間回溯 備註
iceberg iceberg 支援(as_of 引數,REQ-372
delta_lake delta_lake 支援(as_of 引數,REQ-372
hive hive 不支援
hive_s3 hive 不支援 S3 支援的 Hive

NoSQL

mongodbcassandraredis 均具備 Trino 連接器(redis 依該型別的對應 DSL 建構其屬性)。[tool-verified: provisa/federation/trino_connectors.py; provisa/core/models.py] (REQ-017REQ-1097)

數據來源型別 連接器名稱 變異
mongodb mongodb 不支援
cassandra cassandra 不支援
redis redis 不支援

串流

數據來源型別 機制 變異
kafka 聯邦式 Kafka 連接器;結構描述來自 Confluent Schema Registry(Avro、Protobuf、JSON Schema)、手動定義,或樣本推論 (REQ-147REQ-150) 僅支援 Sink (REQ-176)
websocket 外部 WebSocket 訂閱源——連接、訂閱、接收事件;結果經具體化 (REQ-338) 不支援
rss RSS 2.0 / Atom 訂閱源——輪詢,以 pubDate/updated 作為水位標記;結果經具體化 (REQ-342REQ-343) 不支援

推送接收端

數據來源型別 機制 變異
ingest 外部服務以 POST 方式傳送 JSON 事件;結果經具體化 (REQ-331REQ-335) 不支援

圖形與語意

數據來源型別 機制 變異
neo4j 經 HTTP API 執行 Cypher,結果快取於 PostgreSQL (REQ-295) 不支援
sparql SPARQL 1.1 POST,結果快取於 PostgreSQL (REQ-297) 不支援

檔案型

有兩種機制涵蓋檔案。兩者均使用 path 欄位取代 host/port。[tool-verified: provisa/core/models.py] (REQ-553)

單一檔案數據來源——sqlitecsvparquetpath 指向單一檔案。

數據來源型別 傳輸方式 變異
sqlite 本機 支援
csv 本機 不支援
parquet 本機、s3:// 不支援

私有儲存桶需要憑證(來自環境變數的 AWS 區域及金鑰)。如要透過 s3://http(s):// 讀取 CSV,或一次註冊多個檔案,請使用 files 數據來源。[tool-verified: provisa/file_source/source.py]

files 數據來源——將 path 指向一個 glob 模式,遞迴爬取該路徑,並將該目錄註冊為資料表的聯邦目錄。它可透過多種傳輸方式讀取多種格式;下表的內容集合來自檔案連接器(kenstott/calcite fork)。[tool-verified: provisa/core/catalog.py files branch and provisa/core/models.py SOURCE_TO_CONNECTOR; format and transport lists from the calcite file adapter — FileSchema.java, storage/StorageProviderFactory.java]

格式 傳輸方式
CSV、TSV、JSON、YAML、Excel(XLS/XLSX)、Parquet、Arrow,以及轉換為資料表的文件——HTML、Markdown、DOCX、PPTX 本機檔案系統、HTTP(S)、s3://hdfs://ftp:///ftps://sftp://iceberg://、SharePoint(REST 及 Microsoft Graph)
- id: sales_files
  type: files
  path: s3://bucket/sales/**/*.csv   # glob; local and http(s):// also supported

可觀測性及其他

prometheus 具備 Trino 連接器(屬性依該型別的對應 DSL 建構)。google_sheets 為已註冊的數據來源型別,無 Trino 連接器,並透過 API 快取管線進行具體化。[tool-verified: provisa/federation/trino_connectors.py:314; provisa/core/models.py lines 87–88]

數據來源型別 連接器名稱 變異
google_sheets —(具體化) 不支援
prometheus prometheus 不支援

企業 SaaS 連接器

SharePoint 及 Splunk 經 Apache Calcite 連接器(kenstott/calcite fork)註冊。兩者均無直接驅動程式——Provisa 透過啟動連接器內建的 Calcite pgwire 伺服器(pgwire-sharepointpgwire-splunk),以通用 PostgreSQL 端點方式連接,並將資料列落地至具體化儲存區以供聯邦使用,藉此具體化其數據 (REQ-954)。兩個連接器均恆啟用不區分大小寫的名稱比對,以符合各自產品本身不區分大小寫的語意 (REQ-725REQ-730)。[tool-verified: provisa/core/models.py lines 99–100; provisa/federation/trino_connectors.py lines 223–286]

sharepoint

SharePoint 清單會被列舉為結構描述,並公開為可查詢的資料表 (REQ-726REQ-731)。有兩種驗證方式:CLIENT_CREDENTIALS(預設)及透過 PFX 憑證的憑證式驗證 (REQ-727)。mapping 中的密鑰值會於送達連接器之前經密鑰引擎解析 (REQ-729)。[tool-verified: provisa/federation/trino_connectors.py lines 230–252]

數據來源欄位 連接器屬性 備註
base_urlhost site-url SharePoint 網站 URL
username client-id Azure 應用程式客戶端 ID
password client-secret Azure 應用程式客戶端密鑰
database tenant-id Azure 租用戶 UUID
mapping.auth_type auth-type CLIENT_CREDENTIALS(預設)或 CERTIFICATE
mapping.certificate_path certificate-path auth_type: CERTIFICATE 時的 PFX 路徑
mapping.certificate_password certificate-password PFX 密碼

當連接器未公開 information_schema.columns 時,請透過 registerTable 變異,以明確的欄位定義(自 Microsoft Graph API 取得)註冊該資料表 (REQ-732)。

- id: hr-sharepoint
  type: sharepoint
  base_url: https://kenstott.sharepoint.com
  username: ${env:SP_CLIENT_ID}
  password: ${env:SP_CLIENT_SECRET}
  database: ${env:SP_TENANT_ID}
  mapping:
    auth_type: CLIENT_CREDENTIALS

splunk

Splunk 搜尋結果可作為資料表查詢(例如 internal_server)(REQ-721)。連接器 URL 來自 base_url,或以預設連接埠 8089 建構為 https://{host}:{port} (REQ-722)。驗證方式:當 mapping.use_tokentrue(預設)時,password 會作為 API 權杖傳遞;為 false 時,usernamepassword 會作為個別憑證傳遞 (REQ-723)。[tool-verified: provisa/federation/trino_connectors.py lines 262–286]

數據來源欄位 連接器屬性 備註
base_url / host + port url 使用 base_url,否則為 https://host:port(連接埠預設為 8089)
password tokenpassword use_token: true 時為權杖
username user 僅於 use_token: false 時使用
database app 限定於某個 Splunk 應用程式
mapping.datamodel_filter datamodel-filter 篩選至某個數據模型
mapping.disable_ssl_validation disable-ssl-validation 供自簽憑證使用 (REQ-724)
- id: ops-splunk
  type: splunk
  host: splunk
  port: 8089
  password: ${env:SPLUNK_TOKEN}
  mapping:
    use_token: true
    disable_ssl_validation: true

API 數據來源

將任何 HTTP 端點註冊為可查詢的資料表。[tool-verified: provisa/core/models.py SourceType enum] (REQ-314REQ-307REQ-322)

API 型別 探索方式 欄位型別推論
openapi OpenAPI 規格剖析 (REQ-314REQ-316) 原始型別 → 原生型別,物件 → JSONB
graphql_remote 結構描述內省 (REQ-307REQ-308) 原始型別 → 原生型別,物件 → JSONB
grpc_remote 伺服端反射 (REQ-322REQ-325) 原始型別 → 原生型別,物件 → JSONB

API 回應會被擷取、快取於 PostgreSQL(TTL 可設定),並公開為 GraphQL 型別 (REQ-309REQ-318REQ-327)。已快取的資料表與任何其他數據來源相同,均可參與聯邦查詢 (REQ-313)。

JSONB 規則:以 JSONB 儲存的複雜欄位(物件、陣列)不可篩選 (REQ-119)。子欄位存取於 SQL 中使用 ->> 擷取 (REQ-151)。關係是使用純量外部索引鍵欄位於資料表之間宣告——JSONB blob 欄位不能作為 JOIN 目標。若需篩選或 JOIN 巢狀欄位,請使用 JSONB 提升,將其轉換為原生純量欄位 (REQ-119)。

GovData

美國政府開放數據。存取權以主題分組劃分。[tool-verified: provisa/core/models.py lines 543–609]

每個 govdata 數據來源均選擇一個主題。該主題決定了會公開哪些 GovData 結構描述。refgeo 結構描述恆作為連結器結構描述包含在內——它們並未於各主題下逐一列出,但恆為存在。[tool-verified: provisa/core/models.py line 562–563 comment]

主題 公開的結構描述
COMMERCE secpatents
ECONOMY econ
EDUCATION censusedu
HEALTH health
CYBER cyber_threatcyber_vuln
PUBLIC_SAFETY crime
ENVIRONMENT lands
WEATHER weather
GOVERNMENT fedregisterfec
ALL 以上所有結構描述
sources:

  - id: federal-commerce
    type: govdata
    subject: COMMERCE
    domain_id: federal-analytics
    description: U.S. commerce and securities data
欄位 必填 預設值 描述
id 唯一識別碼
subject 上表主題值之一
domain_id 此數據來源所屬的領域
description "" 易於閱讀的描述

自訂連接器 (REQ-1177)

當操作人員於 config/custom_connectors.yaml 中為某個新數據來源型別宣告連接器時,原生聯邦引擎——Postgres、DuckDB 及 ClickHouse——便會取得對該型別的連線能力。無須撰寫任何程式碼。[tool-verified: provisa/federation/custom_connectors.py load_custom_connectors; provisa/federation/engine.py build_pg_engine, build_duckdb_engine, build_clickhouse_engine]

連接器可擴充性本身早於此功能存在。Trino 引擎長久以來在其自身層級即可擴充——每種數據來源型別均以一個通用 JDBC 連接器參數化,每種型別各有一份 catalog .properties 主體,以及 Provisa 自有的自訂 Trino 連接器外掛(Splunk、SharePoint、Calcite)。[tool-verified: provisa/federation/trino_connectors.py _TrinoJdbcConnector, _TRINO_JDBC_TYPES; trino/plugins/trino-splunk, trino/plugins/trino-sharepoint, trino/plugins/trino-calcite] REQ-1177 將此種以設定驅動的可擴充性,帶入以往連接器組合固定的兩個原生、無叢集引擎。

該設定檔預設為空。內建連接器已涵蓋開箱即用的連線範圍;此檔案中的所有內容均由操作人員自行撰寫。[tool-verified: config/custom_connectors.yaml line 52: connectors: []] 可設定 PROVISA_CUSTOM_CONNECTORS 以指向不同的路徑(供測試使用)。

描述器種類

引擎 種類 機制 描述器提供的內容
postgres pg_fdw SQL/MED(ISO 標準) extensionserver_optionsuser_mappingsupports_importtable_optionsremote_schema
duckdb duckdb_attach INSTALL/LOAD + ATTACH extensionprobe_symbolattach_templateremote_schema
duckdb duckdb_scan INSTALL/LOAD + 掃描器檢視 extensionprobe_symbolscan_template
clickhouse clickhouse_database CREATE DATABASE ENGINE=…(自動公開每個遠端資料表) ch_engineengine_template
clickhouse clickhouse_table 逐資料表的 CREATE TABLE ENGINE=…(欄位來自登記表) ch_engineengine_template(可能帶有 {table}
clickhouse clickhouse_scan CREATE TABLE ENGINE=…,由 ClickHouse 推論結構描述 ch_engineengine_template

Postgres 為通用機制。SQL/MED 為 ISO 標準,因此每個符合規範的 FDW 均共用相同的 DDL 形狀:CREATE SERVER … FOREIGN DATA WRAPPER <fdw> OPTIONS(…),選用的 CREATE USER MAPPING,接著為 IMPORT FOREIGN SCHEMA(當 supports_import: true 時)或逐資料表明確的 CREATE FOREIGN TABLE(當為 false 時)。pg_fdw 描述器僅供每個 FDW 各異的部分——擴充功能名稱、伺服器選項鍵、使用者對應鍵、匯入旗標、資料表選項。因此,任何符合標準規範的 FDW 均可單憑設定即可驅動。[tool-verified: provisa/federation/custom_connectors.py GenericPgFdwConnector.details lines 98–125]

DuckDB 支援兩種機制。經 ATTACH 公開目錄的擴充功能使用 duckdb_attach;公開讀取用資料表函式的擴充功能使用 duckdb_scan。若某擴充功能不符合任一模式,則不受支援。[tool-verified: provisa/federation/custom_connectors.py GenericDuckDbAttachConnector, GenericDuckDbScanConnector]

ClickHouse 支援三種機制,各對應一種整合引擎形狀:一種自動公開每個遠端資料表的關聯式 DATABASE 引擎(clickhouse_database,例如 Redis/MySQL)、一種欄位由登記表提供的逐資料表引擎(clickhouse_table,例如 JDBC/ODBC 橋接器——engine_template 可帶有一個由執行階段綁定的 {table} 佔位符),以及一種由 ClickHouse 推論其結構描述的檔案/數據湖/URL 引擎(clickhouse_scan,例如 HDFS/URL)。SQLite(DATABASE 引擎、檔案型、無伺服器)及 Hudi(湖倉一體、零複製)為開箱即用內建項目。[tool-verified: provisa/federation/custom_connectors.py GenericClickHouseDatabaseConnector, GenericClickHouseTableConnector, GenericClickHouseScanConnector; provisa/federation/clickhouse_connectors.py ClickHouseSqliteConnector, ClickHouseHudiConnector] (REQ-1178)

未知的 kind 值會於啟動時直接失敗——描述器的拼字錯誤絕不能在無聲之下使某個數據來源型別無法連接。[tool-verified: provisa/federation/custom_connectors.py load_custom_connectors lines 178–197]

探測閘控

可用性會於連接(attach)時,依各引擎的標準探索目錄進行驗證:

  • Postgres——檢查 pg_extension,其次為 pg_available_extensions。[tool-verified: provisa/federation/connector_duckdb.py _probe_pg_extension lines 333–344]
  • DuckDB——執行 INSTALL/LOAD,並於 duckdb_functions() 中檢查所宣告的 probe_symbol。[tool-verified: provisa/federation/connector_duckdb.py _DuckDBExtensionConnector.probe lines 160–180]
  • ClickHouse——於 system.table_engines 中檢查所宣告的 ch_engine;建置中缺少該項目即直接失敗。[tool-verified: provisa/federation/custom_connectors.py _probe_clickhouse_engine]

無法安裝的已宣告擴充功能會直接失敗。無無聲略過,無備援機制。探測失敗的連接器,對該部署而言即視為未啟用。

範本變數

每個 server_options 值、user_mapping 值、attach_templatescan_template 均可使用 {field} 佔位符。可用欄位:[tool-verified: provisa/federation/custom_connectors.py _source_fields lines 53–63]

{id}{host}{port}{database}{username}{password}{path}{schema_name}{table_name},以及 federation_hints 中的任何鍵。DuckDB attach 範本亦會取得 {alias}——即 Provisa 為已連接資料庫指派的內部目錄別名。

參照未知欄位的範本會於連接(attach)時直接失敗,在錯誤的 DDL 到達引擎之前,即揭露描述器/數據來源不符的情況。

範例

Postgres——經 mongo_fdw 連接 MongoDB(無結構描述匯入;欄位逐資料表提供)

# config/custom_connectors.yaml
connectors:
  - engine: postgres
    source_type: mongodb
    kind: pg_fdw
    extension: mongo_fdw
    mechanism: attach_r
    server_options:
      address: "{host}"
      port: "{port}"
    user_mapping:
      username: "{username}"
      password: "{password}"
    supports_import: false
    table_options:
      database: "{database}"
      collection: "{table_name}"

DuckDB——經 read_xlsx 讀取 Excel 檔案(掃描資料表函式)

  - engine: duckdb
    source_type: xlsx
    kind: duckdb_scan
    extension: excel
    install_from_community: false
    probe_symbol: read_xlsx
    scan_template: "read_xlsx('{path}')"

[tool-verified: config/custom_connectors.yaml commented examples, lines 26–50]

在任一描述器就緒後,以所宣告的 source_type 註冊一個數據來源,即會經由該自訂連接器路由,惟須通過探測。無須其他設定變更。


作為具名數據來源的數據倉庫

無論目前啟用哪個聯邦引擎,Snowflake、Databricks 及 ClickHouse 均可獨立註冊為具名數據來源。[tool-verified: executor/drivers/snowflake.py (REQ-988), executor/drivers/databricks.py (REQ-987), executor/drivers/clickhouse.py (REQ-986)]

註冊後,Provisa 會透過該數據來源的 DirectDriver 讀取該數據倉庫,並將複本落地至使用中引擎的具體化儲存區。查詢隨後即於該複本上執行。這與傳統的可直連路徑(asyncpg、aiomysql)不同——傳統路徑完全略過引擎;此處引擎仍會執行查詢,但是針對本機複本,而非每次要求皆透過線路連往數據倉庫。

於數據倉庫支援之處,讀取採用 Arrow 原生格式:Databricks 使用 Cloud Fetch,Snowflake 使用 fetch_arrow_table,ClickHouse 使用原生欄式 HTTP 介面。

標準的 host/port/username/password 欄位無法承載的擴充連線參數,均置於 federation_hints 中:

sources:
  - id: my-databricks
    type: databricks
    host: my-workspace.azuredatabricks.net
    password: ${env:DATABRICKS_TOKEN}
    federation_hints:
      http_path: /sql/1.0/warehouses/xxxx   # required — the SQL Warehouse connection detail

  - id: my-snowflake
    type: snowflake
    host: org.snowflakecomputing.com
    username: svc_provisa
    password: ${env:SNOWFLAKE_PASSWORD}
    federation_hints:
      account: myorg-myaccount    # required — Snowflake account identifier
      warehouse: COMPUTE_WH       # optional — virtual warehouse to use
      role: PROVISA_ROLE          # optional — Snowflake role

  - id: my-clickhouse
    type: clickhouse
    host: ch.example.com
    port: 8123
    database: analytics
    username: default
    password: ${env:CLICKHOUSE_PASSWORD}
    federation_hints:
      secure: "true"              # optional — enables TLS on the HTTP interface

以具名數據來源身分註冊,與選用相同的數據倉庫作為聯邦引擎兩者互不相干。以 DuckDB 引擎搭配 Snowflake 數據來源,複本會落地至 DuckDB,而非 Snowflake。

雲端物件/數據湖數據(S3 / GCS / R2 上的 parquet、csv、iceberg、delta_lake 檔案)是獨立的一種數據來源型別,當使用中引擎具備該型別的 ATTACH 連接器時會就地連接。不會落地任何複本——引擎會直接掃描物件儲存。此類數據來源的憑證同樣置於 federation_hints 中:

sources:
  - id: r2-events
    type: parquet
    path: s3://my-bucket/events/2026/*.parquet
    federation_hints:
      access_key_id: ${env:R2_ACCESS_KEY}
      secret_access_key: ${env:R2_SECRET}
      account_id: ${env:R2_ACCOUNT_ID}     # Cloudflare R2 account (S3-compatible)

數據來源設定欄位

所有數據來源均共用一組共通欄位。[tool-verified: provisa/core/models.py Source class, lines 138–204]

欄位 必填 預設值 描述
id 唯一識別碼;英數字元加連字號/底線
type 數據來源型別(見上表)
host "" 主機名稱或 IP
port 0 連接埠號碼
database "" 資料庫名稱
username "" 使用者名稱
password "" 密碼;使用 ${env:VAR} 進行密鑰解析
path null 供檔案型及物件/數據湖數據來源使用的檔案路徑或雲端 URI
base_url null OpenAPI 數據來源的基礎 URL
pool_min 1 連線池最小值 (REQ-052)
pool_max 5 連線池最大值 (REQ-052)
use_pgbouncer false 透過 PgBouncer 路由連線 (REQ-053)
pgbouncer_port 6432 PgBouncer 連接埠 (REQ-053)
cache_enabled true 啟用 API 回應快取
cache_ttl null 快取 TTL(秒);為 null 時繼承全域預設值
cache_catalog null 供 API 快取使用的聯邦 catalog;預設為該數據來源自身的 catalog
cache_schema api_cache 快取 catalog 內的結構描述
naming_convention null 為此數據來源覆寫全域命名慣例 (REQ-194)
federation_hints {} 傳遞給聯邦引擎的階段屬性,以及數據倉庫數據來源的擴充連線參數 (REQ-278REQ-281)
mapping {} 供 NoSQL 及 SaaS 數據來源使用的型別專屬連接器設定(例如 SharePoint 的 auth_type、Splunk 的 use_token) (REQ-251)
allowed_domains [] 將數據來源限制於特定領域;留空即不限制
description "" 易於閱讀的描述

Kafka 數據來源

Kafka 主題會於 kafka_sources 下另行設定,以已註冊 kafka 數據來源的 id 作為鍵值。[tool-verified: config/provisa.yaml lines 138–151] (REQ-147)

kafka_sources:

  - id: kafka-support
    topics:

      - id: tickets
        topic: support.tickets
        domain_id: sales-analytics
        description: "Inbound support tickets"
        default_window: 1h
        columns:

          - name: id
          - name: subject
          - name: status
          - name: created_at
欄位 描述
id 須與型別為 kafka 之數據來源的 id 相符
topics[].id 此主題於 Provisa 中的邏輯名稱
topics[].topic Kafka 主題名稱
topics[].domain_id 此主題所屬的領域
topics[].description 易於閱讀的描述
topics[].default_window 視窗化查詢的預設時間視窗(例如 1h) (REQ-148)
topics[].columns 該主題結構描述的欄位定義 (REQ-150)

欄位可見性

每個欄位上的 visible_to 欄位,是可見到該欄位的角色 ID 清單。[tool-verified: provisa/core/models.py Column class line 248; config/provisa.yaml lines 39–51]

columns:

  - name: email
    visible_to: [admin]        # only admin role sees this column

  - name: region
    visible_to: [admin, analyst]  # both roles see this column

未列於某角色 visible_to 清單中的欄位,不會出現於該角色的 GraphQL 結構描述中,亦不可於查詢或篩選條件中被查詢或參照 (REQ-039)。


關係

關係連接兩個已註冊的資料表,並於 GraphQL 中以巢狀欄位形式呈現。[tool-verified: provisa/core/models.py Relationship class lines 323–343; config/provisa.yaml lines 103–110] (REQ-019)

relationships:

  - id: orders-to-customers
    source_table_id: orders
    target_table_id: customers
    source_column: customer_id
    target_column: id
    cardinality: many-to-one
欄位 必填 描述
id 此關係的唯一識別碼
source_table_id 持有外部索引鍵的資料表
target_table_id 被參照的資料表;計算關係時留空
source_column 來源資料表上的欄位
target_column 目標資料表上的欄位;計算關係時留空
cardinality many-to-oneone-to-many (REQ-019)
materialize 自動為跨數據來源 JOIN 建立具體化檢視 (REQ-158)
refresh_interval 具體化檢視重新整理間隔(秒)(預設:300)
target_function_name 供計算關係使用的資料庫函式名稱
function_arg 哪個函式引數接收來源欄位值
alias 易於閱讀的關係型別(例如 WORKS_FOR
graphql_alias 為此關係於母型別上公開的 SDL 欄位命名。缺省時,名稱衍生自目標資料表的 field_name 及關係基數。[tool-verified: provisa/compiler/schema_gen.py:1050]
disable_cypher 設為 true 時,將此關係排除於 Cypher 圖形邊之外
source_json_key 於 JOIN 之前,從來源欄位中以此鍵擷取為一個 JSON 物件

基數值 [tool-verified: provisa/core/models.py Cardinality enum, lines 79–81]:

  • many-to-one——每一來源列對應至一列目標列(外部索引鍵對應至主索引鍵)
  • one-to-many——每一來源列對應至多列目標列(與上述相反)

行級安全規則

行級安全規則會於查詢時注入 WHERE 子句,可限定於某個角色,並可選擇性地限定於某個資料表或領域。[tool-verified: provisa/core/models.py RLSRule class lines 391–395; config/provisa.yaml lines 128–131] (REQ-041)

rls_rules:

  - table_id: orders          # applies to orders table only
    role_id: analyst
    filter: "region = current_setting('provisa.user_region')"

  - domain_id: sales-analytics  # applies to every table in domain (REQ-402)
    role_id: analyst
    filter: "tenant_id = current_setting('provisa.tenant_id')"

當同一角色同時存在領域層級及資料表層級的規則時,資料表層級規則具優先權 (REQ-403)。

欄位 必填 描述
table_id 視情況而定 套用此規則的資料表;與 domain_id 互斥
domain_id 視情況而定 套用此規則的領域;適用於該領域內所有資料表 (REQ-402)
role_id 此規則適用的角色
filter 注入 WHERE 中的 SQL 述詞;可參照階段變數 (REQ-041)

函式與 Webhook

資料庫函式

追蹤一個資料庫函式,並將其公開為 GraphQL 查詢或變異。[tool-verified: provisa/core/models.py Function class lines 423–438; config/provisa.yaml lines 152–164] (REQ-205)

資料庫數據來源亦可從供應商目錄(pg_procinformation_schema.routines,或供應商對應項目)自動探索其預存程序及函式,免除逐一手動註冊的需要。探索過程會讀取 prokindprovolatile:不可變/穩定的函式會註冊為參數化關係(程序引數成為查詢參數,與 OpenAPI GET 資料表相同形狀),而易變的程序則會註冊為變異/已追蹤函式。已探索到的常式,均與手動註冊者一樣經過第二階段治理。[tool-verified: provisa/api/admin/introspect.py:541, provisa/api/admin/introspect.py:593] (REQ-887)

functions:

  - name: get_customers_by_region
    source_id: sales-pg
    schema: public
    function_name: get_customers_by_region
    returns: customers
    domain_id: sales-analytics
    description: "Returns customers filtered by region"
    visible_to: [admin, analyst]
    kind: query
    arguments:

      - name: p_region
        type: String
欄位 必填 預設值 描述
name GraphQL 欄位名稱
source_id 包含此函式的數據來源
schema public 資料庫結構描述
function_name 實際的資料庫函式名稱
returns 此函式所回傳的已註冊資料表 ID (REQ-207)
arguments [] {name, type} 引數定義的清單 (REQ-211)
visible_to [] 可呼叫此函式的角色
writable_by [] 可以變異方式呼叫此函式的角色
domain_id "" 此函式所屬的領域
description null GraphQL 欄位描述
kind mutation "query""mutation" (REQ-205)

Webhook

將一個外部 HTTP 端點公開為 GraphQL 查詢或變異。[tool-verified: provisa/core/models.py Webhook class lines 441–455; config/provisa.yaml lines 166–178] (REQ-209)

webhooks:

  - name: notify_support
    url: http://localhost:9999/notify
    method: POST
    timeout_ms: 3000
    domain_id: sales-analytics
    description: "Send a support notification"
    visible_to: [admin]
    kind: mutation
    arguments:

      - name: message
        type: String
欄位 必填 預設值 描述
name GraphQL 欄位名稱
url Webhook 端點 URL
method POST HTTP 方法
timeout_ms 5000 要求逾時(毫秒)
returns null 已註冊的資料表 ID,或內嵌型別時為 null
inline_return_type [] 供自訂回傳形狀使用的 {name, type} 欄位清單 (REQ-210)
arguments [] {name, type} 引數定義的清單
visible_to [] 可呼叫此 webhook 的角色
domain_id "" 此 webhook 所屬的領域
description null GraphQL 欄位描述
kind mutation "query""mutation"

驗證

驗證設定於 auth 鍵下。[tool-verified: provisa/core/models.py AuthConfig class lines 467–477] (REQ-120)

提供者 描述
none 無驗證;所有要求均視為 default_role
firebase Firebase Authentication;需要 project_idservice_account_key (REQ-121)
keycloak Keycloak OIDC (REQ-122)
oauth 通用 OAuth 2.0 (REQ-123)
simple 無外部提供者的使用者名稱/密碼驗證 (REQ-124)
auth:
  provider: firebase
  assignments_source: provisa   # "claims" or "provisa"
  default_role: analyst
  default_assignments:

    - role_id: analyst
      domain_id: "*"
  firebase:
    project_id: ${env:FIREBASE_PROJECT_ID}
    service_account_key: ${env:FIREBASE_SERVICE_ACCOUNT_KEY}

assignments_source: claims 由 JWT claims 讀取角色指派。assignments_source: provisa 則由 Provisa 自身的指派儲存區讀取。[tool-verified: provisa/core/models.py line 476] (REQ-551)


執行路由

直接執行——單一數據來源的 RDBMS 查詢會路由至原生驅動程式,以取得低於 100 毫秒的延遲 (REQ-027)。數據來源須同時具備 SOURCE_TO_DIALECT 項目及 SOURCE_TO_CONNECTOR 項目,方可支援此路徑 (REQ-229)。

聯邦執行——多數據來源查詢,以及無直接驅動程式的數據來源,均經聯邦引擎路由 (REQ-028)。Provisa 內建一個嵌入式聯邦引擎;如需大規模部署,可指向您自有的相容叢集 (REQ-226)。

統計資料——於註冊時,Provisa 會對每個已公開的資料表執行 ANALYZE,以為成本導向最佳化器預備數據(列數、空值比率、相異值、最小/最大值)。失敗會被記錄,但不會阻擋註冊 (REQ-275)。


圖形與語意數據來源

Neo4j

將 Neo4j 圖形資料庫註冊為可查詢的數據來源。數據管家可撰寫投射純量值的 Cypher 查詢;Provisa 會快取結果並將其公開為 GraphQL 型別 (REQ-295)。

Cypher 查詢的 RETURN 子句必須使用屬性存取子(RETURN n.id AS id, n.name AS name)——回傳節點物件會於註冊時被拒絕 (REQ-296)。

# Register via admin API (no YAML config required)
POST /admin/sources/neo4j
{
  "source_id": "graph",
  "host": "neo4j",
  "port": 7474,
  "database": "neo4j"
}

# Register a table (preview + validate before persisting)
POST /admin/sources/neo4j/graph/tables
{
  "table_name": "person_skills",
  "cypher": "MATCH (p:Person)-[:HAS_SKILL]->(s:Skill) RETURN p.name AS name, s.skill AS skill, p.experience AS years",
  "ttl": 300
}

預覽端點(POST /admin/sources/neo4j/{id}/preview)會回傳樣本列,並在 Cypher 回傳節點物件時阻擋註冊 (REQ-296)。

SPARQL

將任何符合 SPARQL 1.1 規範的三元組存儲(Apache Jena Fuseki、Virtuoso、Stardog 等)註冊為可查詢的數據來源 (REQ-297)。

查詢必須為 SELECT 查詢。SELECT 子句中的變數名稱會自動成為欄位名稱 (REQ-297)。

# Register via admin API
POST /admin/sources/sparql
{
  "source_id": "knowledge-graph",
  "endpoint_url": "http://fuseki:3030/ds/sparql",
  "default_graph_uri": "http://example.org/graph"
}

# Register a table (executes LIMIT 5 probe to validate and infer columns)
POST /admin/sources/sparql/knowledge-graph/tables
{
  "table_name": "product_categories",
  "sparql_query": "SELECT ?product ?label ?category WHERE { ?product a :Product ; rdfs:label ?label ; :hasCategory ?category . }",
  "ttl": 600
}

兩個連接器均使用 API 數據來源快取管線——結果會以可設定的 TTL 存放於 PostgreSQL,使其可用於跨數據來源的聯邦 JOIN (REQ-295REQ-297REQ-299)。


連線範例

PostgreSQL

- id: sales-pg
  type: postgresql
  host: postgres
  port: 5432
  database: provisa
  username: provisa
  password: ${env:PG_PASSWORD}

Snowflake

- id: analytics-sf
  type: snowflake
  host: org.snowflakecomputing.com
  port: 443
  database: ANALYTICS
  username: svc_provisa
  password: ${env:SNOWFLAKE_PASSWORD}
  federation_hints:
    account: myorg-myaccount
    warehouse: COMPUTE_WH

Databricks

- id: lakehouse-db
  type: databricks
  host: my-workspace.azuredatabricks.net
  password: ${env:DATABRICKS_TOKEN}
  federation_hints:
    http_path: /sql/1.0/warehouses/xxxx

MongoDB

- id: reviews-mongo
  type: mongodb
  host: mongodb
  port: 27017
  database: provisa
  username: ""
  password: ""

跨數據來源查詢

{
  orders(where: {region: {eq: "us"}}) {
    id
    amount
    customers {       # PostgreSQL
      name
      email
    }
    productReviews {  # MongoDB (federated)
      rating
      comment
    }
  }
}

單一數據來源的部分直接路由 (REQ-027)。跨數據來源的 JOIN 會自動進行型別強制轉換以進行聯邦 (REQ-028REQ-552)。