在 Azure Synapse Analytics 中使用無伺服器 SQL 集區存取 Lake 資料庫

Azure Synapse Analytics 工作區可讓您在 Spark Data Lake 之上建立兩種類型的資料庫:

  • 您可以使用 Apache Spark 筆記本、資料庫範本或 Microsoft Dataverse(先前為 Common Data Service)在 Lake 數據上定義數據表的 Lake 資料庫 。 這些數據表將可用於使用無伺服器 SQL 集區使用 T-SQL(Transact-SQL) 語言進行查詢。
  • 您可以使用無伺服器 SQL 集區直接定義自己的資料庫和資料表的 SQL 資料庫 。 您可以使用 T-SQL CREATE DATABASE、CREATE EXTERNAL TABLE 來定義物件,並在數據表頂端新增其他 SQL 檢視、程式和內嵌數據表值函式。

Diagram that shows Lake and SQL databases that are created on top of Data Lake files.

本文著重於 Azure Synapse Analytics 中無伺服器 SQL 集區中的湖資料庫

Azure Synapse Analytics 可讓您使用 Spark 或資料庫設計工具建立 Lake 資料庫和數據表,然後使用無伺服器 SQL 集區分析 Lake 資料庫中的數據。 在 Apache Spark 集區、 資料庫範本或 Dataverse 上建立的 Lake 資料庫和數據表(parquet 或 CSV 支援)會自動可供使用無伺服器 SQL 集區引擎進行查詢。 經過修改的 Lake 資料庫和數據表將在一段時間後,於無伺服器 SQL 集區中使用。 在Spark或設計的資料庫變更出現在無伺服器之前,將會有延遲。

管理 Lake 資料庫

若要管理 Spark 建立的 Lake 資料庫,您可以使用 Apache Spark 集區或 資料庫設計工具。 例如,透過 Spark 集區作業建立或刪除 Lake 資料庫。 您無法使用無伺服器 SQL 集區在 Lake 資料庫中建立 Lake 資料庫或物件。

Spark default 資料庫可在無伺服器 SQL 集區內容中使用,做為名為 default的 Lake 資料庫。

注意

您無法在無伺服器 SQL 集區中建立具有相同名稱的 Lake 和 SQL 資料庫。

無法從無伺服器 SQL 集區修改 Lake 資料庫中的數據表。 使用資料庫設計工具或 Apache Spark 集區來修改 Lake 資料庫。 無伺服器 SQL 集區可讓您使用 Transact-SQL 命令在 Lake 資料庫中進行下列變更:

  • 在 Lake 資料庫中新增、改變和卸除檢視、程式、內嵌數據表值函式。
  • 新增和移除資料庫範圍的 Microsoft Entra 使用者。
  • 將 Microsoft Entra 資料庫使用者新增或移除至 db_datareader 角色。 db_datareader角色中的 Microsoft Entra 資料庫用戶有權讀取 Lake 資料庫中的所有數據表,但無法從其他資料庫讀取數據。

安全性模型

湖資料庫和數據表會在兩個層級受到保護:

  • 將下列其中一項指派給 Microsoft Entra 使用者,以建立基礎儲存層:
    • Azure 角色型存取控制 (Azure RBAC)
    • Azure 屬性型訪問控制 (Azure ABAC) 角色
    • ACL 許可權
  • 您可以在其中定義 Microsoft Entra 使用者的 SQL 層,並將 SQL 許可權授與參考湖數據的數據表中的 SELECT 數據。

Lake 安全性模型

使用儲存層上的 Lake 許可權來控制對 Lake 資料庫檔案的存取。 只有 Microsoft Entra 使用者可以使用 Lake 資料庫中的數據表,而且他們可以使用自己的身分識別來存取 Lake 中的數據。

您可以將外部數據表所使用的基礎數據存取權授與安全性主體,例如:使用者、具有 指派服務主體的 Microsoft Entra 應用程式或安全組。 針對數據存取,請授與下列兩個許可權:

  • read (R) 與檔案的許可權(例如數據表的基礎數據檔)。
  • execute (X) 與儲存盤案的資料夾許可權,以及存放在根目錄的每個父資料夾上。 您可以在存取控制清單(ACL) 頁面上深入瞭解這些許可權

例如,在 中 https://<storage-name>.dfs.core.windows.net/<fs>/synapse/workspaces/<synapse_ws>/warehouse/mytestdb.db/myparquettable/,安全性主體需要:

  • execute (X)從開始<fs>myparquettable至 的所有資料夾許可權。
  • read (R) 許可權與 myparquettable 該資料夾內的檔案,以便能夠讀取資料庫中的數據表(已同步處理或原始數據表)。

如果安全性主體需要能夠在資料庫中建立物件或卸除物件,則需要資料夾中的資料夾和檔案warehouse的額外write (W)許可權。 無法從無伺服器 SQL 集區修改資料庫中的物件,而只能從 Spark 集區或 資料庫設計工具修改物件。

SQL 安全性模型

Azure Synapse 工作區提供 T-SQL 端點,可讓您使用無伺服器 SQL 集區來查詢 Lake 資料庫。 除了數據存取之外,SQL 介面還可讓您控制誰可以存取數據表。 您必須讓使用者能夠使用無伺服器 SQL 集區來存取共用的 Lake 資料庫。 有兩種類型的使用者可以存取 Lake 資料庫:

  • 管理員 istrators:指派Synapse SQL 管理員 istrator 工作區角色或無伺服器 SQL 集區內的系統管理員伺服器層級角色。 此角色可完全控制所有資料庫。 Synapse 管理員 istrator 和 Synapse SQL 管理員 istrator 角色預設也會擁有無伺服器 SQL 集區中所有物件的所有許可權。
  • 工作區讀取者:將伺服器層級許可權 GRANT CONNECT ANY DATABASEGRANT SELECT ALL USER SECURABLES on 無伺服器 SQL 集區授與登入,讓登入能夠存取和讀取任何資料庫。 這可能是將讀取者/非系統管理員存取權指派給用戶的絕佳選擇。
  • 資料庫讀取器:從 Lake 資料庫中的 Microsoft Entra ID 建立資料庫使用者,並將其新增至 db_datareader 角色,這可讓他們讀取 Lake 資料庫中的數據。

在這裡深入瞭解如何設定 共享資料庫的訪問控制。

Lake 資料庫中的自定義 SQL 物件

Lake 資料庫允許建立自定義 T-SQL 物件,例如架構、程式、檢視和內嵌數據表值函式 (iTVF)。 若要建立自定義 SQL 物件,您必須建立將放置對象的架構。 自定義 SQL 物件無法放在架構中 dbo ,因為它會保留給 Spark、資料庫設計工具或 Dataverse 中定義的 Lake 數據表。

重要

您必須建立將放置 SQL 物件的自訂 SQL 架構。 自訂 SQL 物件不能放在架構中 dbo 。 架構 dbo 會保留給原本在 Spark 或資料庫設計工具中建立的 Lake 數據表。

範例

在 Lake 資料庫中建立 SQL 資料庫讀取器

在此範例中,我們會在 Lake 資料庫中新增 Microsoft Entra 使用者,以透過共用數據表讀取數據。 用戶會透過無伺服器 SQL 集區在 Lake 資料庫中新增。 然後,將使用者指派給 db_datareader 角色,以便讀取數據。

CREATE USER [customuser@contoso.com] FROM EXTERNAL PROVIDER;
GO
ALTER ROLE db_datareader
ADD MEMBER [customuser@contoso.com];

建立工作區層級的數據讀取器

具有 GRANT CONNECT ANY DATABASEGRANT SELECT ALL USER SECURABLES 許可權的登入可以使用無伺服器 SQL 集區讀取所有數據表,但無法建立 SQL 資料庫或修改其中的物件。

CREATE LOGIN [wsdatareader@contoso.com] FROM EXTERNAL PROVIDER
GRANT CONNECT ANY DATABASE TO [wsdatareader@contoso.com]
GRANT SELECT ALL USER SECURABLES TO [wsdatareader@contoso.com]

此腳本可讓您建立使用者,而不需要系統管理員許可權,即可讀取 Lake 資料庫中的任何數據表。

使用無伺服器 SQL 集區建立並連線至 Spark 資料庫

首先,使用您已在工作區中建立的Spark叢集,建立名為 mytestdb 的新Spark資料庫。 例如,您可以使用 Spark C# Notebook 搭配下列 .NET for Spark 語句來達成此目的:

spark.sql("CREATE DATABASE mytestlakedb")

在短暫延遲之後,您可以從無伺服器 SQL 集區看到 Lake 資料庫。 例如,從無伺服器 SQL 集區執行下列語句。

SELECT * FROM sys.databases;

確認結果中包含 。mytestlakedb

在 Lake 資料庫中建立自訂 SQL 物件

下列範例示範如何在架構中 reports 建立自定義檢視、程式和內嵌數據表值函式 (iTVF):

CREATE SCHEMA reports
GO

CREATE OR ALTER VIEW reports.GreenReport
AS SELECT puYear, puMonth,
            fareAmount = SUM(fareAmount),
            tipAmount = SUM(tipAmount),
            mtaTax = SUM(mtaTax)
FROM dbo.green
GROUP BY puYear, puMonth
GO

CREATE OR ALTER PROCEDURE reports.GreenReportSummary
AS BEGIN
SELECT puYear, puMonth,
            fareAmount = SUM(fareAmount),
            tipAmount = SUM(tipAmount),
            mtaTax = SUM(mtaTax)
FROM dbo.green
GROUP BY puYear, puMonth
END
GO

CREATE OR ALTER FUNCTION reports.GreenDataReportMonthly(@year int)
RETURNS TABLE
RETURN ( SELECT puYear = @year, puMonth,
                fareAmount = SUM(fareAmount),
                tipAmount = SUM(tipAmount),
                mtaTax = SUM(mtaTax)
        FROM dbo.green
        WHERE puYear = @year
        GROUP BY puMonth )
GO

下一步