在 Azure Synapse Analytics 中控制無伺服器 SQL 集區的儲存體帳戶存取

無伺服器 SQL 集區查詢會直接從 Azure 儲存體讀取檔案。 存取 Azure 儲存體上檔案的許可權會控制在兩個層級:

  • 儲存體層級 - 使用者應具有存取基礎儲存體檔案的許可權。 您的儲存體系統管理員應該允許 Microsoft Entra 主體讀取/寫入檔案,或產生將用來存取儲存體的共用存取簽章 (SAS) 金鑰。
  • SQL 服務等級 - 使用者應該已授與許可權,才能使用 外部資料表 或執行函 OPENROWSET 式來讀取資料。 深入瞭解 本節 中的必要許可權。

本文說明您可以使用的認證類型,以及 SQL 和 Microsoft Entra 使用者如何制定認證查閱。

儲存體權限

Synapse Analytics 工作區中的無伺服器 SQL 集區可以讀取儲存在 Azure Data Lake Storage 中的檔案內容。 您必須設定儲存體的許可權,才能讓執行 SQL 查詢的使用者讀取檔案。 有三種方法可以啟用檔案的存取:

  • 角色型存取控制 (RBAC) 可讓您將角色指派給存放區所在租使用者中的某些 Microsoft Entra 使用者。 讀取器必須是儲存體帳戶上儲存體 Blob 資料讀取器、儲存體 Blob 資料參與者或儲存體 Blob 資料擁有者角色的成員。 在 Azure 儲存體中寫入資料的使用者必須是儲存體 Blob 資料參與者或儲存體 Blob 資料擁有者角色的成員。 儲存體擁有者角色並不表示使用者也會儲存體資料擁有者。
  • 存取控制清單 (ACL) 可讓您定義 Azure 儲存體中檔案和目錄的精細 讀取(R)、寫入(W) 和 Execute(X) 許可權 。 ACL 可以指派給 Microsoft Entra 使用者。 如果讀者想要讀取 Azure 儲存體中路徑上的檔案,則他們必須對檔案路徑中的每個資料夾具有執行 (X) ACL,以及對檔案具有讀取 (R) ACL。 深入了解如何在儲存體層中設定 ACL 權限。
  • 共用存取簽章 (SAS) 可讓讀取者使用限時權杖存取 Azure Data Lake 儲存體上的檔案。 讀者甚至不需要以 Microsoft Entra 使用者身分進行驗證。 SAS 權杖包含授與讀者的權限,以及權杖有效的期間。 SAS 權杖是時間限制存取任何甚至不需要位於相同 Microsoft Entra 租使用者的使用者的絕佳選擇。 您可以在儲存體帳戶或特定目錄上定義 SAS 權杖。 深入了解使用共用存取簽章授與 Azure 儲存體資源的有限存取權

或者,您可以允許匿名存取,讓您的檔案可公開使用。 如果您有非公用資料,則不應使用此方法。

支援的儲存體授權類型

登入無伺服器 SQL 集區的使用者必須獲授權,才能存取和查詢Azure 儲存體中的檔案,如果檔案無法公開使用。 您可以使用四種授權類型來存取非公用儲存體:使用者身 分識別、共用存取簽章 服務主體 和 受控識別

注意

當您建立工作區時,Microsoft Entra 傳遞 是預設行為。

使用者身 分識別,也稱為「Microsoft Entra 傳遞」,是一種授權類型,其中登入無伺服器 SQL 集區之 Microsoft Entra 使用者的身分識別是用來授權資料存取。 存取資料之前,Azure 儲存體系統管理員必須授與 Microsoft Entra 使用者的許可權。 如資料庫使用者資料表 支援的授權類型中所述 ,SQL 使用者類型不支援它。

重要

用戶端應用程式可能會快取 Microsoft Entra 驗證權杖。 例如,Power BI 會快取 Microsoft Entra 權杖,並在一小時內重複使用相同的權杖。 如果權杖在查詢執行中間到期,長時間執行的查詢可能會失敗。 如果您遇到在查詢中間過期的 Microsoft Entra 存取權杖所造成的查詢失敗,請考慮切換至 服務主體 受控識別 共用存取簽章

您必須是儲存體 Blob 資料擁有者、儲存體 Blob 資料參與者或儲存體 Blob 資料讀取者角色的成員,才能使用身分識別來存取資料。 或者,您可以指定更細緻的 ACL 規則來存取檔案和資料夾。 即使您是儲存體帳戶的擁有者,您仍然需要將自己新增至其中一個儲存體 Blob 資料角色。 若要深入瞭解 Azure Data Lake Store Gen2 中的存取控制,請檢閱 Azure Data Lake 儲存體 Gen2 中的存取控制一文。

跨租使用者案例

如果Azure 儲存體與 Synapse 無伺服器 SQL 集區位於不同的租使用者中,建議使用透過服務主體 進行授權 您也可以使用 SAS 授權,但 不支援受控識別

授權類型 受防火牆保護的儲存體 非防火牆保護的儲存體
Sas 支援 支援
Service Principal 不支援 支援

注意

如果Azure 儲存體受到 Azure 儲存體防火牆 的保護, 則不支援服務主體

資料庫使用者支援的授權類型

下表提供 Azure Synapse Analytics 無伺服器 SQL 端點中不同登入方法的可用Azure 儲存體授權類型:

授權類型 SQL 使用者 Microsoft Entra 使用者 服務主體
使用者身分識別 不支援 支援 支援
Sas 支援 支援 支援
服務主體 支援 支援 支援
受控識別 支援 支援 支援

支援的儲存體和授權類型

您可以使用下列授權類型和Azure 儲存體類型組合:

授權類型 Blob 儲存體 ADLS Gen1 ADLS Gen2
Sas 支援 不支援 支援
服務主體 支援 支援 支援
受控識別 支援 支援 支援
使用者身分識別 支援 支援 支援

跨租使用者案例

如果Azure 儲存體與 Azure Synapse Analytics 無伺服器 SQL 集區位於不同的租使用者中,建議使用透過服務主體 進行授權 您也可以使用共用存取簽章 授權。 不支援受控服務識別

授權類型 受防火牆保護的儲存體 非防火牆保護的儲存體
Sas 支援 支援
服務主體 不支援 支援

注意

如果Azure 儲存體受到 Azure 儲存體防火牆 的保護,且位於另一個租使用者中, 則不支援服務主體 。 請改用共用存取簽章 (SAS)。

受防火牆保護的儲存體

您可以藉由建立 資源實例規則 ,設定儲存體帳戶以允許存取特定無伺服器 SQL 集區。 存取使用防火牆保護的儲存體時,請使用 使用者身分識別 受控識別

注意

Azure 儲存體上的防火牆功能處於公開預覽狀態,且可在所有公用雲端區域中使用。

下表提供 Azure Synapse Analytics 無伺服器 SQL 端點中不同登入方法的可用防火牆保護Azure 儲存體授權類型:

授權類型 SQL 使用者 Microsoft Entra 使用者 服務主體
使用者身分識別 不支援 支援 支援
Sas 不支援 不支援 不支援
服務主體 不支援 不支援 不支援
受控識別 支援 支援 支援

若要透過使用者身分識別存取以防火牆保護的儲存體,您可以使用 Azure 入口網站 或 Az.儲存體 PowerShell 模組。

透過 Azure 入口網站 Azure 儲存體 防火牆設定

  1. 在 Azure 入口網站 中搜尋您的儲存體帳戶。
  2. 在主要導覽功能表中,移至 [設定 ] 底下的 [網路 ]。
  3. 在 [資源實例 ] 區段中 ,新增 Azure Synapse 工作區的例外狀況。
  4. 選取 Microsoft.Synapse/workspaces 作為 [資源類型 ]。
  5. 選取工作區的名稱作為 實例名稱
  6. 選取 [儲存]。

透過 PowerShell Azure 儲存體防火牆設定

請遵循下列步驟來設定儲存體帳戶,並新增 Azure Synapse 工作區的例外狀況。

  1. 開啟 PowerShell 或 安裝 PowerShell

  2. 安裝最新版的 Az.儲存體 模組和 Az.Synapse 模組,例如下列腳本:

    Install-Module -Name Az.Storage -RequiredVersion 3.4.0
    Install-Module -Name Az.Synapse -RequiredVersion 0.7.0
    

    重要

    請確定您至少 使用 3.4.0 版。 您可以執行此命令來檢查 Az.儲存體 版本:

    Get-Module -ListAvailable -Name Az.Storage | Select Version
    
  3. 連線至您的 Azure 租使用者:

    Connect-AzAccount
    
  4. 在 PowerShell 中定義變數:

        $resourceGroupName = "<resource group name>"
        $accountName = "<storage account name>"
        $tenantId = "<tenant id>"
        $workspaceName = "<Azure Synapse workspace name>"
    
        $workspace = Get-AzSynapseWorkspace -Name $workspaceName
        $resourceId = $workspace.Id
        $index = $resourceId.IndexOf("/resourceGroups/", 0)
        # Replace G with g - /resourceGroups/ to /resourcegroups/
        $resourceId = $resourceId.Substring(0,$index) + "/resourcegroups/" ` 
            + $resourceId.Substring($index + "/resourceGroups/".Length)
    
        $resourceId
    

    重要

    PowerShell 腳本所傳回的值 $resourceid 應該符合此範本:/subscriptions/{subscription-id}/resourcegroups/{resource-group}/providers/Microsoft.Synapse/workspaces/{name-of-workspace} 請務必以小寫撰寫 資源群組

  5. 新增 Azure 儲存體帳戶網路規則:

        $parameters = @{
            ResourceGroupName = $resourceGroupName
            Name = $accountName
            TenantId = $tenantId 
            ResourceId = $resourceId
        }
    
        Add-AzStorageAccountNetworkRule @parameters
    
  6. 確認儲存體帳戶網路規則已套用在儲存體帳戶防火牆中。 下列 PowerShell 腳本會將 $resourceid 先前步驟中的變數與儲存體帳戶網路規則的輸出進行比較。

        $parameters = @{
            ResourceGroupName = $resourceGroupName
            Name = $accountName
        }
    
        $rule = Get-AzStorageAccountNetworkRuleSet @parameters
        $rule.ResourceAccessRules | ForEach-Object { 
            if ($_.ResourceId -cmatch "\/subscriptions\/(\w\-*)+\/resourcegroups\/(.)+") { 
                Write-Host "Storage account network rule is successfully configured." -ForegroundColor Green
                $rule.ResourceAccessRules
            } else {
                Write-Host "Storage account network rule is not configured correctly. Remove this rule and follow the steps in detail." -ForegroundColor Red
                $rule.ResourceAccessRules
            }
        }
    

認證

若要查詢位於 Azure 儲存體 中的檔案,您的無伺服器 SQL 集區端點需要包含驗證資訊的認證。 使用兩種類型的認證:

  • 伺服器層級認證用於使用 OPENROWSET 函式執行的臨機操作查詢。 認證 名稱 必須符合儲存體 URL。
  • 資料庫範圍認證用於外部資料表。 具有應該用來存取儲存體之認證的外部資料表參考 DATA SOURCE

授與管理認證的許可權

若要授與管理認證的能力:

  • 若要允許使用者建立或卸載伺服器層級認證,系統管理員必須在 master 資料庫中授 ALTER ANY CREDENTIAL 與其登入的許可權。 例如:

    GRANT ALTER ANY CREDENTIAL TO [login_name];
    
  • 若要允許使用者建立或卸載資料庫範圍認證,系統管理員必須將資料庫的許可權授 CONTROL 與使用者資料庫中的資料庫使用者。 例如:

    GRANT CONTROL ON DATABASE::[database_name] TO [user_name];
    

授與許可權以使用認證

存取外部儲存體的資料庫使用者必須具有使用認證的許可權。 若要使用認證,使用者必須具有 REFERENCES 特定認證的許可權。

若要授 REFERENCES 與登入之伺服器層級認證的許可權,請在 master 資料庫中使用下列 T-SQL 查詢:

GRANT REFERENCES ON CREDENTIAL::[server-level_credential] TO [login_name];

若要為資料庫使用者授與 REFERENCES 資料庫範圍認證的許可權,請在使用者資料庫中使用下列 T-SQL 查詢:

GRANT REFERENCES ON DATABASE SCOPED CREDENTIAL::[database-scoped_credential] TO [user_name];

伺服器層級認證

當 SQL 登入呼叫 OPENROWSET 函式而不 DATA_SOURCE 讀取儲存體帳戶上的檔案時,會使用伺服器層級認證。

伺服器層級認證 的名稱必須 符合 Azure 儲存體的基底 URL,選擇性地後面接著容器名稱。 執行 CREATE CREDENTIAL 會新增 認證。 您必須提供 CREDENTIAL NAME 引數。

注意

不支援 自 FOR CRYPTOGRAPHIC PROVIDER 變數。

伺服器層級的 CREDENTIAL 名稱必須符合下列格式: <prefix>://<storage_account_path>[/<container_name>] 。 下表說明儲存體帳戶路徑:

外部資料來源 Prefix 儲存體帳戶路徑
Azure Blob 儲存體 https <storage_account>.blob.core.windows.net
Azure Data Lake Storage Gen1 https <storage_account>.azuredatalakestore.net/webhdfs/v1
Azure Data Lake Storage Gen2 https <storage_account>.dfs.core.windows.net

然後,伺服器層級認證就可以使用下列驗證類型來存取 Azure 儲存體:

如果 Microsoft Entra 使用者是儲存體 Blob 資料擁有者、儲存體 Blob 資料參與者或儲存體 Blob 資料讀取者角色的成員,則可以存取 Azure 儲存體上的任何檔案。 Microsoft Entra 使用者不需要認證來存取儲存體。

SQL 驗證的使用者無法使用 Microsoft Entra 驗證來存取儲存體。 他們可以使用受控識別、SAS 金鑰、服務主體,或如果有公用存取儲存體,透過資料庫認證存取儲存體。

資料庫範圍認證

當任何主體呼叫 OPENROWSET 函式時,會使用資料庫範圍認證, DATA_SOURCE 或從 無法存取公用檔案的外部資料表 中選取資料。 資料庫範圍認證不需要符合儲存體帳戶的名稱,它會在定義儲存體位置的 DATA SOURCE 中參考。

資料庫範圍認證可讓您使用下列驗證類型來存取 Azure 儲存體:

如果 Microsoft Entra 使用者是儲存體 Blob 資料擁有者、儲存體 Blob 資料參與者或儲存體 Blob 資料讀取者角色的成員,則可以存取 Azure 儲存體上的任何檔案。 Microsoft Entra 使用者不需要認證來存取儲存體。

CREATE EXTERNAL DATA SOURCE mysample
WITH (    LOCATION   = 'https://<storage_account>.dfs.core.windows.net/<container>/<path>'
)

SQL 驗證的使用者無法使用 Microsoft Entra 驗證來存取儲存體。 他們可以使用受控識別、SAS 金鑰、服務主體,或如果有公用存取儲存體,透過資料庫認證存取儲存體。

資料庫範圍認證用於外部資料源,以指定將用來存取此儲存體的驗證方法:

CREATE EXTERNAL DATA SOURCE mysample
WITH (    LOCATION   = 'https://<storage_account>.dfs.core.windows.net/<container>/<path>',
          CREDENTIAL = <name of database scoped credential> 
)

範例

存取公開可用的資料來源

使用下列腳本來建立可存取公開可用資料來源的資料表。

CREATE EXTERNAL FILE FORMAT [SynapseParquetFormat]
       WITH ( FORMAT_TYPE = PARQUET)
GO
CREATE EXTERNAL DATA SOURCE publicData
WITH ( LOCATION = 'https://<storage_account>.dfs.core.windows.net/<public_container>/<path>' )
GO

CREATE EXTERNAL TABLE dbo.userPublicData ( [id] int, [first_name] varchar(8000), [last_name] varchar(8000) )
WITH ( LOCATION = 'parquet/user-data/*.parquet',
       DATA_SOURCE = [publicData],
       FILE_FORMAT = [SynapseParquetFormat] )

資料庫使用者可以使用參考資料源的外部資料表或 OPENROWSET 函式,從資料來源讀取檔案的內容:

SELECT TOP 10 * FROM dbo.userPublicData;
GO
SELECT TOP 10 * FROM OPENROWSET(BULK 'parquet/user-data/*.parquet',
                                DATA_SOURCE = 'mysample',
                                FORMAT='PARQUET') as rows;
GO

使用認證存取資料來源

修改下列腳本以建立外部資料表,以使用 SAS 權杖、使用者的 Microsoft Entra 身分識別或工作區的受控識別來存取 Azure 儲存體。

-- Create master key in databases with some password (one-off per database)
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong password>'
GO

-- Create databases scoped credential that use Managed Identity, SAS token or service principal. User needs to create only database-scoped credentials that should be used to access data source:

CREATE DATABASE SCOPED CREDENTIAL WorkspaceIdentity
WITH IDENTITY = 'Managed Identity'
GO
CREATE DATABASE SCOPED CREDENTIAL SasCredential
WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = 'sv=2019-10-1********ZVsTOL0ltEGhf54N8KhDCRfLRI%3D'
GO
CREATE DATABASE SCOPED CREDENTIAL SPNCredential WITH
IDENTITY = '**44e*****8f6-ag44-1890-34u4-22r23r771098@https://login.microsoftonline.com/**do99dd-87f3-33da-33gf-3d3rh133ee33/oauth2/token' 
, SECRET = '.7OaaU_454azar9WWzLL.Ea9ePPZWzQee~'
GO
-- Create data source that one of the credentials above, external file format, and external tables that reference this data source and file format:

CREATE EXTERNAL FILE FORMAT [SynapseParquetFormat] WITH ( FORMAT_TYPE = PARQUET)
GO

CREATE EXTERNAL DATA SOURCE mysample
WITH ( LOCATION = 'https://<storage_account>.dfs.core.windows.net/<container>/<path>'
-- Uncomment one of these options depending on authentication method that you want to use to access data source:
--,CREDENTIAL = WorkspaceIdentity 
--,CREDENTIAL = SasCredential 
--,CREDENTIAL = SPNCredential
)

CREATE EXTERNAL TABLE dbo.userData ( [id] int, [first_name] varchar(8000), [last_name] varchar(8000) )
WITH ( LOCATION = 'parquet/user-data/*.parquet',
       DATA_SOURCE = [mysample],
       FILE_FORMAT = [SynapseParquetFormat] );

資料庫使用者可以使用 參考資料源的外部資料表 OPENROWSET 函式,從資料來源讀取檔案的內容:

SELECT TOP 10 * FROM dbo.userdata;
GO
SELECT TOP 10 * FROM OPENROWSET(BULK 'parquet/user-data/*.parquet', DATA_SOURCE = 'mysample', FORMAT='PARQUET') as rows;
GO

下一步

這些文章可協助您瞭解如何查詢不同的資料夾類型、檔案類型,以及建立和使用檢視: