適用於:SQL Server 2025 (17.x)
Azure SQL Database
AzureSQL Managed Instance
Microsoft Fabric
本文將教你如何使用 T-SQL Object_ID 語法,在 Azure SQL 資料庫、Fabric SQL 資料庫、Azure SQL 管理實例,以及 SQL Server 2025 及以後版本中,建立 Microsoft Entra 登入帳號及使用者,並使用非唯一顯示名稱。
備註
你可以在 Fabric SQL 資料庫建立使用者,但不能建立登入。
概觀
Microsoft Entra ID 支援服務主體的認證。 然而,使用顯示名稱在 Microsoft Entra ID 中不唯一的服務主體時,會在 SQL Server、Azure SQL 資料庫和 Azure SQL 管理實例中建立登入或使用者時出錯。
例如,如果應用程式 myapp 不是唯一的,你可能會遇到以下錯誤:
Msg 33131, Level 16, State 1, Line 4
Principal 'myapp' has a duplicate display name. Make the display name unique in Azure Active Directory and execute this statement again.
嘗試執行以下 T-SQL 陳述句時:
CREATE LOGIN [myapp] FROM EXTERNAL PROVIDER
擴充功能WITH OBJECT_ID
重複 顯示名稱 錯誤發生是因為 Microsoft Entra ID 允許 Microsoft Entra 應用程式(服務主體)使用重複顯示名稱,而 SQL Server 和 Azure SQL 則需要唯一名稱來建立 Microsoft Entra 登入和使用者。 為了緩解此問題,建立登入與使用者的資料定義語言(Data Definition Language,DDL)語句已擴充,包含 Azure 資源 WITH OBJECT_ID 的物件 ID。
備註
Microsoft Entra ID 中大多數非唯一顯示名稱與服務主體相關,但偶爾群組名稱也可能非唯一。 Microsoft Entra 的使用者主體名稱是唯一的,因為兩個使用者不能擁有相同的使用者主體。 然而,可以建立一個應用程式註冊(服務主體),其顯示名稱可以與使用者主體名稱相同。
如果服務主體的顯示名稱不是重複的,則應使用預設 CREATE LOGIN 或 CREATE USER 語句。 延伸 WITH OBJECT_ID 模組是一項疑難解答修復專案,可搭配非統一的服務主體使用。 不建議與獨特的服務主體一起使用。 使用服務主體的 WITH OBJECT_ID 延伸項目而不新增尾碼將會成功執行,但所建立登入或使用者對應的服務主體並不明顯。 建議使用尾碼建立別名,以唯一標識服務主體。 此 WITH OBJECT_ID 擴充套件支援 SQL Server 2025 及更新版本。
T-SQL 建立非唯一顯示名稱的登入/使用者語法
CREATE LOGIN [login_name] FROM EXTERNAL PROVIDER
WITH OBJECT_ID = 'objectid'
CREATE USER [user_name] FROM EXTERNAL PROVIDER
WITH OBJECT_ID = 'objectid'
透過 T-SQL DDL 支援擴充功能,可以建立帶有物件 ID 的登入或使用者,您可以避免錯誤 33131 ,並指定以物件 ID 建立的登入或使用者別名。 例如,以下 T-SQL 範例使用 myapp4466e 應用程式物件 ID aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb建立登入資料。
CREATE LOGIN [myapp4466e] FROM EXTERNAL PROVIDER
WITH OBJECT_ID = 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb'
- 要執行此 T-SQL 查詢,指定的物件 ID 必須存在於 SQL 資源所在的 Microsoft Entra 租戶中。 否則,
CREATE指令將失敗並出現錯誤訊息:Msg 37545, Level 16, State 1, Line 1 '' is not a valid object id for '' or you do not have permission. - 登入或使用者名稱必須包含原始服務主體名稱,並在使用
CREATE LOGINorCREATE USER語句時加上使用者定義的後綴。 作為最佳實務,後綴可以包含物件 ID 的開頭部分。 例如,myapp2ba6c物件 IDbbbbbbbb-1111-2222-3333-cccccccccccc為 。 不過,你也可以自訂後綴。 不需要從物件 ID 組成後綴。
建議採用此命名規則,明確將資料庫使用者或登入者關聯回其 Microsoft Entra ID 中的物件。
備註
別名遵循 T-SQL 規範, sysname最大長度為 128 個字元。 我們建議將後綴限制在物件 ID 的前五個字元。
Microsoft Entra ID 中服務主體的顯示名稱並未與資料庫登入或使用者別名同步。 執行 CREATE LOGIN 或 CREATE USER 不會影響 Azure 入口網站中的顯示名稱。 同樣地,修改 Microsoft Entra ID 的顯示名稱不會影響資料庫登入或使用者別名。
辨識為該應用程式所建立的用戶
對於非唯一服務主體,確認 Microsoft Entra 別名是否綁定到正確的應用程式非常重要。 為了檢查使用者是否為正確的服務主體(應用程式)所建立:
從使用者在 Azure SQL 或 SQL Server 中建立的應用程式取得 應用程式 ID,或從 Microsoft Entra 群組取得 物件 ID。 請參考以下查詢:
要從建立的使用者取得服務主體的 應用程式 ID ,請執行以下查詢:
SELECT CAST(sid as uniqueidentifier) ApplicationID, create_date FROM sys.server_principals WHERE NAME = 'myapp2ba6c'範例輸出︰
應用程式 ID 是從指定登入或使用者名稱的安全識別碼(SID)轉換而來,我們可以透過執行下一次 T-SQL 查詢並比較最後幾位數字並建立日期來確認:
SELECT SID, create_date FROM sys.server_principals WHERE NAME = 'myapp2ba6c'範例輸出︰
要從使用者建立的 Microsoft Entra 群組中取得 物件 ID,請執行以下查詢:
SELECT CAST(sid as uniqueidentifier) ObjectID, createdate FROM sys.sysusers WHERE NAME = 'myappgroupd3451b'範例輸出︰
若要檢查用戶創建的 Microsoft Entra 群組的 SID,請執行以下查詢:
SELECT SID, createdate FROM sys.sysusers WHERE NAME = 'myappgroupd3451b'範例輸出︰
要取得應用程式的物件 ID 與應用程式 ID,請使用 PowerShell 執行以下指令:
Get-AzADApplication -DisplayName "myapp2ba6c"
到 Azure入口網站,在你的 企業應用程式 或Microsoft Entra群組資源中,分別勾選 應用程式ID 或 物件ID 。 看看是否與前一個查詢的結果相符。
備註
在從服務主體建立使用者時,當使用 T-SQL 語句搭配 WITH OBJECT_ID 子句時,必須包含 物件 ID。 這和你在 SQL Server 驗證別名時回傳的 應用程式 ID 不同。 透過此驗證流程,您可以識別與 Microsoft Entra ID 中 SQL 別名相關的服務主體或群組,並避免在建立使用物件 ID 的登入或使用者時可能出現錯誤。
尋找正確的物件 ID
關於服務主體的物件 ID 資訊,請參見 服務主體物件。 你可以在 Azure 入口網站的 企業應用程式名稱旁找到服務主體的物件 ID。
警告
在 應用程式註冊 總覽頁面取得的物件 ID 與在 企業應用程式 總覽頁面取得的物件 ID 不同。 如果您在應用程式註冊總覽頁面,請選擇鏈接的本地目錄中的受管理應用程式名稱,以導航到企業應用程式總覽頁面的正確物件 ID。