適用於:Azure SQL 資料庫
資料庫層級的管理身份為 Azure SQL Database 中的個別資料庫提供其專屬的使用者指派管理身份(UAMI)。 具有此功能的資料庫會以自身身分向 Azure 儲存體 驗證,而非以承載它的邏輯伺服器身分驗證。
如果沒有資料庫層級的識別,邏輯伺服器上的每個資料庫都會共用該伺服器的受控識別,因此它們都會存取相同的儲存體。 資料庫層級的身分識別會將存取範圍縮小到單一資料庫,因此你可以只給每個資料庫所需的儲存空間。
你選擇的是資料庫範圍憑證中的身分識別,這也是資料虛擬化查詢用來讀取 Azure Blob 儲存體 或 Azure Data Lake Storage(ADLS)Gen2 中 Parquet、CSV 和 Delta 檔案的相同憑證。 請從兩個認證身分值中選擇:
| 認證身分 | 在下列情況下使用 |
|---|---|
DATABASE MANAGED IDENTITY |
儲存體帳戶和資料庫在同一個 Microsoft Entra 租戶裡。 |
DATABASE FEDERATED CLIENT IDENTITY |
儲存帳號位於另一個租戶中,透過聯邦身份憑證(FIC)存取。 |
Note
作為預覽功能,本文所述的技術受限於 Microsoft Azure 預覽版增補使用規定。
Prerequisites
- 一個邏輯伺服器上的 Azure SQL Database。 所有服務層級及所有 Azure 區域都支援此功能。
- 同一訂閱中由使用者指派的受控識別。 背景資料請參閱 Microsoft Entra for Azure SQL 的 Managed identities.
- 在目標儲存帳號上指派角色的權限,例如 擁有者 或 使用者存取管理員。
- 用 Azure Blob 儲存體 或 ADLS Gen2 帳號來存放你想查詢的檔案。
Important
資料庫在資料庫層級只能指派一個由使用者指派的受控識別,與邏輯伺服器不同,邏輯伺服器可以有多個。 在指派之前,先規劃每個資料庫的識別。
如果資料庫在資料庫層級使用 客戶管理的金鑰,則它已經擁有資料庫層級的身分識別,而跨租戶的金鑰則有聯邦用戶端 ID。 這個功能使用了同樣的兩個設定。 將儲存權限授予現有身份或應用程式,而非指派新的。 如果你指派了不同的身份或應用程式,先讓它存取加密金鑰。 否則,更新可能會失敗,或資料庫可能會失去對金鑰的存取權。
選擇同租戶或跨租戶
兩個操作都會建立資料庫範圍的憑證並查詢外部資料。 它們的不同之處在於身分識別如何傳送到儲存帳戶。
- 如果資料庫和儲存帳號在同一個租戶裡,請遵循「 在同一租戶中使用資料庫層級的身份」。
- 如果儲存帳號屬於不同租戶,請依照「 跨租戶使用聯邦客戶識別碼」的做法。
在同一租戶中使用資料庫層級的身份
步驟 1:建立使用者指派的受控識別
建立該識別,並記錄其 資源 ID 與 物件(主體)ID。 你需要資源 ID 來將身份指派給資料庫。 你只在跨租戶逐步解說中需要物件(主體)ID,該 ID 在其中用來識別聯邦身分識別憑證的主體。
az identity create \
--name <identity-name> \
--resource-group <resource-group> \
--location <region>
其他方法請參見 管理使用者指派受控識別。
步驟二:將識別身分指派到資料庫
將 UAMI 指派到 資料庫,而不是邏輯伺服器。 此指派使用的機制與採用客戶管理金鑰的資料庫層級透明資料加密(TDE)相同,詳見 資料庫層級的客戶管理金鑰。 關於完整的指派方法集合,請參見 「取得或設定資料庫的受控識別」。
若要在 Azure 入口網站中指派身分識別:
- 去你的 SQL 資料庫。
- 在 [安全性] 下,選取 [身分識別]。
- 在 User-Assigned 受控識別 下,選擇 新增。
- 選擇你建立的識別,然後選擇 新增。
- 選取 [儲存]。
要使用 Azure CLI 指派身分識別,請使用 az sql db update:
az sql db update \
--resource-group <resource-group> \
--server <server-name> \
--name <database-name> \
--assign-identity \
--user-assigned-identity-id <identity-resource-id>
要用 PowerShell 指派它,請使用 Set-AzSqlDatabase:
Set-AzSqlDatabase -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -DatabaseName <DatabaseName> -AssignIdentity -UserAssignedIdentityId <UserAssignedIdentityId>
身份 資源 ID 看起來像 /subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identity-name>。 在 Azure 入口網站的受控識別中,於 屬性 下找到它。
步驟 3:授權身份存取儲存空間
給予受控識別對儲存體帳戶的讀取權限:
- 前往儲存帳戶。
- 選擇 存取控制 (IAM)。
- 選取 新增>新增角色指派。
- 選擇 Storage Blob Data Reader 角色,然後選擇 下一步。
- 針對 [存取權指派對象為],選取 [受控識別]。
- 選擇選擇成員,選擇你由使用者指派的受控識別,然後選擇選擇。
- 選擇 檢閱 + 指派。
若在 ADLS Gen2 上進行更細緻的存取,請在特定目錄上設定存取控制清單(ACL),而非在帳號層級指派角色。 欲了解更多資訊,請參閱 Azure Data Lake Storage 中的存取控制清單。
步驟 4:建立資料庫範圍認證資訊
連接到你的 使用者資料庫,而不是系統資料庫master,並建立憑證:
CREATE DATABASE SCOPED CREDENTIAL MyDBIdentityCred
WITH IDENTITY = 'DATABASE MANAGED IDENTITY';
這個憑證不需要秘密,也不需要資料庫主金鑰。 引擎會在查詢時解析分配給資料庫的識別身分。
伺服器層級的對應項使用不同的識別值。 比較:
-- Server-level identity: every database on the logical server shares this access
CREATE DATABASE SCOPED CREDENTIAL MyServerIdentityCred
WITH IDENTITY = 'MANAGED IDENTITY';
-- Database-level identity: only this database has this access
CREATE DATABASE SCOPED CREDENTIAL MyDBIdentityCred
WITH IDENTITY = 'DATABASE MANAGED IDENTITY';
完整語法請參見 CREATE DATABASE SCOPED CREDENTIAL。
步驟 5:建立外部資料來源
建立一個指向你的容器的外部資料來源,並附加憑證。 請使用與你儲存類型的前綴:
| 儲存體類型 | 位置前綴 |
|---|---|
| Azure Blob 儲存體 | abs:// |
| ADLS Gen2 | adls:// |
CREATE EXTERNAL DATA SOURCE MyExternalStorage
WITH (
LOCATION = 'abs://<container>@<storage-account>.blob.core.windows.net',
CREDENTIAL = MyDBIdentityCred
);
步驟6:查詢資料
臨時查詢檔案 OPENROWSET:
SELECT TOP 100 *
FROM OPENROWSET(
BULK 'sales/2026/*.parquet',
DATA_SOURCE = 'MyExternalStorage',
FORMAT = 'parquet'
) AS externalData;
或定義一個外部表格用於重複查詢:
CREATE EXTERNAL FILE FORMAT ParquetFormat
WITH (FORMAT_TYPE = PARQUET);
CREATE EXTERNAL TABLE dbo.Sales
(
OrderId int,
OrderDate date,
Amount decimal(10, 2)
)
WITH (
LOCATION = 'sales/2026/',
DATA_SOURCE = MyExternalStorage,
FILE_FORMAT = ParquetFormat
);
SELECT TOP 100 * FROM dbo.Sales;
跨租戶使用聯邦用戶端識別
當你的資料庫在一個租戶,而儲存體帳戶在另一個租戶時,請使用這條路徑。 多租戶應用程式註冊承載彼此之間的信任:資料庫的 UAMI 是該應用程式上聯邦身分憑證的主體,而儲存租戶則授予該應用程式的服務主體對資料的存取權。
這個模式比照 用於透明資料加密的跨租戶客戶管理金鑰,因此如果你已經使用這個功能,這個設定看起來很熟悉。
步驟 1:註冊多租戶應用程式
在存放資料庫的租戶中,請在 Microsoft Entra ID 中註冊一個多租用戶應用程式,並記錄其應用程式(用戶端)ID。
如需詳細資訊,請參閱使用 Microsoft 身分識別平台註冊應用程式。
步驟 2:新增聯邦身份憑證
在該應用程式中加入同盟識別認證,使其信任資料庫的使用者指派受控識別。 應用程式與受管理身份必須屬於同一個 Microsoft Entra 租戶。
- 在應用程式註冊中,選擇 憑證與秘密>聯邦認證>新增認證。
- 對於 聯邦憑證情境,請選擇「受控識別」。
- 選擇你在同一租戶攻略的步驟 1中建立的受控識別。
- 確認自動填入的 Issuer 是否識別你的租用戶。 對於 Azure 公有雲,發行者為
https://login.microsoftonline.com/<tenant-id>/v2.0。 - 確保 Audience 是
api://AzureADTokenExchange,即 Azure 公有雲的值。 - 輸入唯一的憑證名稱,然後儲存。
憑證的主體是受管理身份的 物件(主體)ID,而非用戶端ID。 如果你手動設定憑證,請精確複製物件(主體)ID,因為 subject 區分大小寫。 當你儲存憑證時,Microsoft Entra ID 會接受錯誤的發行者、主體或受眾值,但權杖交換後來失敗。
欲了解更多資訊,請參閱 「設定應用程式以信任受控識別」。
步驟三:同意應用程式並授予儲存存取權
在持有儲存帳戶的租戶中:
- 系統管理員對多租戶應用程式授與同意,這會在該租戶中建立服務主體。
- 將儲存帳號上的 Storage Blob Data Reader 角色指派給該服務主體。 依照 步驟 3:授與該身分對儲存體的存取權,但是在 指派存取權給 中,選擇 使用者、群組或服務主體,然後選擇應用程式的服務主體。
步驟 4:在資料庫中設定聯邦客戶端 ID
在持有該資料庫的租用戶中,將使用者指派的受控識別指派到資料庫,並將步驟 1 中的應用程式(用戶端)ID 設定為 同盟用戶端 ID:
- 去你的 SQL 資料庫。
- 在 [安全性] 下,選取 [身分識別]。
- 在 使用者指派的受控識別 中,檢查同一租戶逐步解說中 步驟 1 所述的識別是否已列出。 如果沒有,選擇 新增,選擇識別,然後選擇 新增。
- 在 聯邦客戶端身份下,選擇應用程式,然後選擇 儲存。
用 Azure CLI 設定:
az sql db update \
--resource-group <resource-group> \
--server <server-name> \
--name <database-name> \
--assign-identity \
--user-assigned-identity-id <identity-resource-id> \
--federated-client-id <application-client-id>
要用 PowerShell 設定:
Set-AzSqlDatabase -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -DatabaseName <DatabaseName> -AssignIdentity -UserAssignedIdentityId <UserAssignedIdentityId> -FederatedClientId <ApplicationClientId>
步驟五:建立憑證與查詢
CREATE DATABASE SCOPED CREDENTIAL MyCrossTenantCred
WITH IDENTITY = 'DATABASE FEDERATED CLIENT IDENTITY';
CREATE EXTERNAL DATA SOURCE PartnerStorage
WITH (
LOCATION = 'adls://<container>@<storage-account>.dfs.core.windows.net',
CREDENTIAL = MyCrossTenantCred
);
接著建立一個外部資料表,或完全依照 OPENROWSET 中的方式,對 執行 PartnerStorage。
比較伺服器層級與資料庫層級的識別
| 特性 | 伺服器層級受控識別 | 資料庫層級的受控識別 |
|---|---|---|
| 身分範圍 | 邏輯伺服器 | 單一資料庫 |
| 憑證語法 | IDENTITY = 'MANAGED IDENTITY' |
IDENTITY = 'DATABASE MANAGED IDENTITY' |
| 跨租戶儲存體存取 | 不支援。 改用共用存取簽章 | 資料庫上設定的聯邦客戶端 ID,與 IDENTITY = 'DATABASE FEDERATED CLIENT IDENTITY' 搭配使用 |
| 儲存體 RBAC 細緻度 | 伺服器上每個資料庫各有一個識別碼 | 每個資料庫一個身分識別 |
| 暴露範圍 | 伺服器上的所有資料庫都共用存取 | 僅限於單一資料庫 |
| 身份類型 | 系統指派或使用者指派 | 僅限使用者指派 |
| 需要資料庫主金鑰 | No | No |
這兩種憑證可以共存於同一邏輯伺服器及其資料庫中。 選擇最符合你安全需求的憑證。
地理複製與故障轉移
你將識別碼指派給資料庫,因此每個副本都有自己的指派。 在切換前,請以與主要相同的方式設定異地次要複本:
- 將主資料庫所使用的相同使用者指派受控識別指派給次要資料庫。
- 授予該身份如 步驟 3:授予該身份對儲存空間的存取權限 中所述的相同儲存存取權限。
- 跨租戶存取時,在次要資料庫上設定相同的 聯邦用戶端身份 。
當你這樣配置兩個副本時,使用資料庫範圍憑證的查詢在故障轉移後仍能正常運作。 此需求與 資料庫層級的客戶管理金鑰相符,且每個副本上也需有身分識別。
Limitations
- 僅限 Azure SQL Database。 Azure SQL 受控執行個體、SQL Server 和 Azure Synapse Analytics 不支援這些憑證身份。
- 只支援對外驗證。 此功能不會改變使用者和應用程式 如何向資料庫進行驗證。
- 在
master資料庫中不受支援。 在使用者資料庫中建立憑證。 - 僅限使用者指派的受管理身份。 系統指派的受控識別是對邏輯伺服器的範圍,因此無法作為資料庫層級的識別。
- 每個資料庫只有一個使用者指派的受控識別。
- 此預覽僅涵蓋資料虛擬化:
CREATE EXTERNAL TABLE和OPENROWSET搭配DATA_SOURCE。 其他出站功能,例如sp_invoke_external_rest_endpoint,則不在範圍內。
Troubleshoot
建立資料庫範圍的憑證並不能保證資料庫識別能取得權杖或存取儲存。 錯誤會在後續出現,例如建立外部資料來源或執行使用該憑證的查詢。
資料庫身份未設定(錯誤 15858)
你可以先使用 IDENTITY = 'DATABASE MANAGED IDENTITY' 建立憑證,然後再將使用者指派的受控識別指派給資料庫。 若查詢使用該憑證,且資料庫沒有可用來取得權杖的身分識別,則查詢會以錯誤 15858 失敗:
Cannot obtain a Microsoft Entra ID token to access storage. Error message: 'Azure SQL Server or Database identity is not configured. Please follow the steps in "Assign a Microsoft Entra managed identity to your Azure SQL" (https://aka.ms/SQLDBMSI)'.
依步驟 2 指派一個由使用者指派的管理身份給資料庫,授權其存取儲存帳號,然後重新嘗試查詢。 只將身份指派給邏輯伺服器並不會設定資料庫層級的身份。 如果資料庫指派已生效且錯誤持續存在,請聯絡 Microsoft 支援服務 調查資料庫身分識別佈建。
Note
追蹤旗標 4675 以及 使用受控識別備份和還原至 URL 中的刪除後重新建立步驟,會套用到 Azure 虛擬機器上的 SQL Server。 它們不適用於 Azure SQL Database 中的資料庫層級受控識別。
無法找到或引用憑證(錯誤 46516)
當你建立外部資料來源時,Azure SQL Database 會檢查該憑證是否存在於目前資料庫中,且你是否有權引用它。 如果任一檢查都失敗,就會收到錯誤 46516:
The specified credential cannot be found or the user does not have permission to perform this action.
在包含外部資料來源的資料庫建立憑證,檢查憑證名稱,並確保你有權限引用該憑證。
令牌取得失敗(錯誤 15858)
當資料庫無法取得 Microsoft Entra 令牌,且令牌提供者回傳理由時,錯誤 15858 包含該原因:
Cannot obtain a Microsoft Entra ID token to access storage. Error message: '<details>'.
利用巢狀錯誤訊息找出令牌請求失敗的原因。 跨租戶存取時,請檢查應用程式、儲存租戶中的管理員同意,以及聯邦身分識別憑證,詳見 設定應用程式以信任受控識別。
若要讀取外部資料,身分識別也需要儲存體資料角色。 若需同租戶存取,請在容器或儲存帳戶上將 Storage Blob Data Reader 授與資料庫的使用者指派受控識別。 跨租戶存取時,將權限授予應用程式在儲存租戶中的服務主體。 如需詳細資訊,請參閱 指派 Azure 角色以存取 Blob 數據。
檔案不存在或無法存取(錯誤 4860)
當檔案遺失或無法讀取時,會出現錯誤 4860:
Cannot bulk load. The file "<path>" does not exist or you don't have file access rights. See https://go.microsoft.com/fwlink/?LinkId=2374938 for more information.
檢查檔案是否存在於設定位置。 接著檢查請求所使用的身分是否能透過儲存體資料角色存取該資源,或在 ADLS Gen2 中透過路徑上的存取控制清單(ACL)存取該資源。
網路存取被阻擋(錯誤 42121 與 16539)
當邏輯伺服器與不允許對儲存帳戶的外寄流量的網路安全邊界相關聯時,會出現錯誤 42121:
The operation could not be completed because attempts to connect were denied by the configured Network Security Perimeter.
在邊界設定檔中新增儲存帳號主機名稱的出站存取規則,或將儲存帳號與相同的邊界關聯。 欲了解更多資訊,請參閱 Azure SQL Database 的網路安全邊界。
當邏輯伺服器的出站網路被限制,且儲存帳號不在出站防火牆規則中時,會出現錯誤 16539:
Operation failed since the external data source '<external-data-source>' has underlying storage account that is not in the list of Outbound Firewall Rules on the server. Please add this storage account to the list of Outbound Firewall Rules on your server and retry the operation.
針對外部資料來源位置中的確切儲存主機名稱,新增一個出站防火牆規則。 欲了解更多資訊,請參閱 Azure SQL Database 與 Azure Synapse Analytics 的 Outbound 防火牆規則。
跨租戶設定缺失或錯誤(錯誤 16561 與 16562)
跨租戶查詢可能因以下任一錯誤或錯誤 4860 而失敗:
External table '<table-name>' is not accessible because content of directory cannot be listed.
External table '<table-name>' is not accessible because location does not exist or it is used by another process.
這些錯誤代表查詢無法存取檔案。 身份可能沒有所需的儲存角色,網路存取可能被阻擋,儲存位置可能無法解析,或令牌可能是屬於錯誤的租戶。 若要修正此問題:
- 授予適當的儲存資料角色。
- 允許網路存取儲存體帳戶。
- 將容器包含在外部資料來源位置。
- 使用
DATABASE FEDERATED CLIENT IDENTITY,並在資料庫中設定 聯邦客戶端 ID ,依 步驟 4 說明。 - 確認聯邦身份憑證的主體與受管理身份的物件(主體)ID 完全一致。
故障轉移後查詢會失敗
若故障轉移後查詢因權杖或授權錯誤而失敗,新的主節點可能不具備原始主節點所使用的使用者指派受控識別。 或者那個身分可能沒有在儲存體帳戶上指派角色。 為兩個副本指派相同的身分識別,並授與其存取儲存體的權限,如 地理複寫與容錯移轉所述。
常見問題
伺服器層級與資料庫層級的憑證能否共存於同一台伺服器上?
是的,在同一台邏輯伺服器和同一個資料庫裡。 每個憑證的 IDENTITY 值決定查詢使用哪個身份:MANAGED IDENTITY 使用伺服器身份,而 DATABASE MANAGED IDENTITY 使用資料庫身份。
我可以使用系統指派的受控識別嗎?
No. 系統指派的受控識別屬於邏輯伺服器,因此你無法將它的範圍限制在單一資料庫。 使用使用者指派的受控識別。
哪些服務層級和地區支援這個預覽?
所有 Azure SQL Database 服務層級,在所有 Azure 區域。
我需要資料庫主金鑰嗎?
No.
DATABASE MANAGED IDENTITY和DATABASE FEDERATED CLIENT IDENTITY都不使用秘密,因此不需要主金鑰。
這個功能可與 sp_invoke_external_rest_endpoint 搭配運作嗎?
這次預覽中沒有。 預覽涵蓋資料虛擬化。