教學:建立並使用 Microsoft Entra 伺服器登入

本文將引導你如何在 Azure Synapse Analytics 專用 SQL 池(前稱 SQL DW)的虛擬 資料庫中,建立並使用由 Microsoft Entra ID(前稱 Azure Active Directory)支援的 master。 Azure Synapse Analytics 工作空間中的專用 SQL 池不使用邏輯 SQL 伺服器。

注意

Microsoft Entra server principals 目前正在 Azure Synapse Analytics 中預覽。

在這個教學中,你會學到如何:

  • 在虛擬master資料庫中建立 Microsoft Entra 登入
  • 在虛擬 master 資料庫中建立對應到 Microsoft Entra 登入的使用者
  • 使用 WITH OBJECT_ID 的語法來表示非唯一的顯示名稱
  • 將伺服器角色授與 Microsoft Entra 使用者
  • 停用 Microsoft Entra 登入

Prerequisites

  • 一個 Azure Synapse Analytics 專用的 SQL 池和一個資料庫。
  • 已為 Azure Synapse Analytics 設定 Microsoft Entra 驗證。 欲了解更多資訊,請參閱「配置與管理 Microsoft Entra 認證與 Azure Synapse Analytics」。
  • 本文會引導您在虛擬 master 資料庫內建立 Microsoft Entra 登入和使用者。 只有 Microsoft Entra 管理員才能在虛擬 master 資料庫內建立使用者,因此建議您學習本教學課程時,使用 Microsoft Entra 管理帳戶。 具有 loginmanager 角色的 Microsoft Entra 主體可以建立登入帳戶,但無法在虛擬 master 資料庫中建立使用者。

注意

對於在 Microsoft Entra ID 中處理非唯一顯示名稱的組織 (特別是服務主體),請確定您有可供您計劃建立登入的任何服務主體使用的物件識別碼資訊。 WITH OBJECT_ID語法延伸可以幫助解決這些情況。

建立 Microsoft Entra 登入

  1. 為 Microsoft Entra 帳號建立登入。 在此範例中,請使用存在於名為 contoso 的 Microsoft Entra 網域中的 bob@contoso.com。 你也可以從 Microsoft Entra 群組或服務主體(應用程式)建立登入帳號。 如需詳細資訊,請參閱 CREATE LOGIN (Transact-SQL)。

    注意

    第一次 Microsoft Entra 登入必須由 Microsoft Entra 管理員建立。Microsoft Entra 管理員可以是 Microsoft Entra 使用者或群組。 SQL 認證登入無法建立 Microsoft Entra 登入。

    Tip

    如果你在 Microsoft Entra ID 中遇到非唯一顯示名稱的問題,請使用 WITH OBJECT_ID 語法延伸。 此功能對於具有重複顯示名稱的服務主體特別有用。 例如:

    CREATE LOGIN [myapp4466e] FROM EXTERNAL PROVIDER
      WITH OBJECT_ID = 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb'
    

    欲了解更多資訊,請參閱 名稱考量。

  2. 使用 SQL Server Management Studio (SSMS),以 Microsoft Entra 管理員帳號登入你的專用 SQL 池。

  3. 展開 資料庫>系統資料庫。 以滑鼠右鍵按兩下 master 資料庫,然後選取 [[新增查詢],以在 master 資料庫的內容中開啟新的查詢視窗。

  4. 執行下列查詢:

    CREATE LOGIN [bob@contoso.com] FROM EXTERNAL PROVIDER
    GO
    
  5. 檢查 sys.server_principals 中已建立的登入。 執行以下查詢:

    SELECT name, type_desc, type, is_disabled
    FROM sys.server_principals
    WHERE type_desc like 'external%'
    

    你會看到類似以下的輸出:

    Name                            type_desc       type   is_disabled
    bob@contoso.com                 EXTERNAL_LOGIN  E      0
    
  6. 登入名稱 bob@contoso.com 資料是在虛擬 master 資料庫中建立的。

從 Microsoft Entra 登入建立使用者

  1. 建立 Microsoft Entra 登入後,建立一個資料庫層級的 Microsoft Entra 使用者,該使用者會對應到虛擬master資料庫中的 Microsoft Entra 登入。 為了說明如何將使用者加入特殊角色,請使用我們的範例 bob@contoso.com,在虛擬 master 資料庫中建立一個使用者。 只有 Microsoft Entra 管理員或 SQL Server 管理員才能在虛擬 master 資料庫中建立使用者。

  2. 使用虛擬 master 資料庫,但如果你想在其他資料庫建立使用者,也可以重新連接你選擇的資料庫。 執行下列查詢。

    CREATE USER [bob@contoso.com] FROM LOGIN [bob@contoso.com]
    

    Tip

    雖然不需要使用 Microsoft Entra 使用者別名 (例如 bob@contoso.com),建議最佳做法是針對 Microsoft Entra 使用者和 Microsoft Entra 登入使用相同的別名。

    如果你需要直接從外部提供者建立具有特定物件 ID 的使用者(例如,為了解決非唯一顯示名稱問題),請使用以下語法:

    CREATE USER [user_name] FROM EXTERNAL PROVIDER
      WITH OBJECT_ID = 'objectid'
    
  3. 檢查 sys.database_principals 中已建立的使用者。 執行以下查詢:

    SELECT name, type_desc, type
    FROM sys.database_principals
    WHERE type_desc like 'external%'
    

    你會看到類似以下的輸出:

    Name                            type_desc       type
    bob@contoso.com                 EXTERNAL_USER   E
    

注意

目前仍支援在沒有 Microsoft Entra 登入的情況下建立 Microsoft Entra 使用者的現有語法。 如果你執行以下語法,你會在你所連接的特定資料庫中建立一個資料庫內含使用者。 這個使用者未與任何登入建立關聯,即使虛擬資料庫中有同名 master 的登入。

例如: CREATE USER [bob@contoso.com] FROM EXTERNAL PROVIDER 。

您可以使用非唯一顯示名稱的服務主體建立 Microsoft Entra 登入。 欲了解更多資訊,請參閱 名稱考量。

授與 Microsoft Entra 登入伺服器層級的角色

你可以將登入新增至固定伺服器層級角色,例如 ##MS_DefinitionReader##、##MS_ServerStateReader## 或 ##MS_ServerStateManager## 角色(位於 master 資料庫中)。

注意

Microsoft Entra 群組不支援此處提及的伺服器層級角色。

ALTER SERVER ROLE ##MS_DefinitionReader## ADD MEMBER [AzureAD_object];
ALTER SERVER ROLE ##MS_ServerStateReader## ADD MEMBER [AzureAD_object];
ALTER SERVER ROLE ##MS_ServerStateManager## ADD MEMBER [AzureAD_object];

在使用者重新連線之前,權限不會生效。 也會排清 DBCC 快取:

DBCC FLUSHAUTHCACHE
DBCC FREESYSTEMCACHE('TokenAndPermUserStore') WITH NO_INFOMSGS

若要檢查哪些 Microsoft Entra 登入屬於伺服器層級角色,請執行下列查詢:

SELECT roles.principal_id AS RolePID,roles.name AS RolePName,
       server_role_members.member_principal_id AS MemberPID, members.name AS MemberPName
       FROM sys.server_role_members AS server_role_members
       INNER JOIN sys.server_principals AS roles
       ON server_role_members.role_principal_id = roles.principal_id
       INNER JOIN sys.server_principals AS members
       ON server_role_members.member_principal_id = members.principal_id;

向 Microsoft Entra 使用者授與特殊角色 

你可以在虛擬 資料庫中為使用者指派 master。

要授予使用者其中一個特殊資料庫角色,使用者必須存在於虛擬 master 資料庫中。

要將使用者加入角色,請執行以下查詢:

ALTER ROLE [dbmanager] ADD MEMBER [AzureAD_object]

請執行下列查詢,從角色中移除使用者:

ALTER ROLE [dbmanager] DROP MEMBER [AzureAD_object]

AzureAD_object 可以是 Microsoft Entra ID 中的 Microsoft Entra 使用者、群組或服務主體。

在以下範例中,你建立使用者 bob@contoso.com。 將 dbmanager 和 loginmanager 角色指派給使用者。

  1. 執行下列查詢:

    ALTER ROLE [dbmanager] ADD MEMBER [bob@contoso.com]
    ALTER ROLE [loginmanager] ADD MEMBER [bob@contoso.com]
    
  2. 執行下列查詢以檢查資料庫角色指派:

    SELECT DP1.name AS DatabaseRoleName,
      isnull (DP2.name, 'No members') AS DatabaseUserName
    FROM sys.database_role_members AS DRM
    RIGHT OUTER JOIN sys.database_principals AS DP1
      ON DRM.role_principal_id = DP1.principal_id
    LEFT OUTER JOIN sys.database_principals AS DP2
      ON DRM.member_principal_id = DP2.principal_id
    WHERE DP1.type = 'R'and DP2.name like 'bob%'
    

    你會看到類似以下的輸出:

    DatabaseRoleName       DatabaseUserName
    dbmanager              bob@contoso.com
    loginmanager           bob@contoso.com
    

選擇性 - 停用登入

使用 ALTER LOGIN (Transact-SQL) DDL 語法來啟用或停用專用 SQL 池中的 Microsoft Entra 登入。

ALTER LOGIN [bob@contoso.com] DISABLE

要讓 DISABLE 或 ENABLE 變更立即生效,請使用以下 T-SQL 指令清除認證快取與 TokenAndPermUserStore 快取:

DBCC FLUSHAUTHCACHE
DBCC FREESYSTEMCACHE('TokenAndPermUserStore') WITH NO_INFOMSGS

請執行以下查詢確認登入是否被停用:

SELECT name, type_desc, type
FROM sys.server_principals
WHERE is_disabled = 1