Microsoft Entra ログインと一意ではない表示名を持つユーザー

適用対象:Azure SQL データベースAzure SQL Managed Instance

Microsoft Entra ID で一意ではない表示名を持つサービス プリンシパルを使用すると、Azure SQL でログインまたはユーザーを作成するときにエラーが発生します。 たとえば、アプリケーション myapp が一意でない場合は、次の T-SQL ステートメントを実行すると以下のエラーが発生することがあります。

CREATE LOGIN [myapp] FROM EXTERNAL PROVIDER 
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. 

WITH OBJECT_ID 拡張機能

Microsoft Entra ID で Microsoft Entra アプリケーション (サービス プリンシパル) の表示名が重複しているのに対し、Azure SQL では Microsoft Entra ログインとユーザーを作成するには一意の名前が必要であるためにエラーが発生します。 この問題を回避するために、WITH OBJECT_ID 句に Azure リソースのオブジェクト ID が含まれるように、ログインとユーザーを作成するデータ定義言語 (DDL) ステートメントが拡張されます。

Note

WITH OBJECT_ID 拡張機能は現在パブリック プレビュー段階にあります。

Microsoft Entra ID の一意ではない表示名のほとんどはサービス プリンシパルに関連していますが、グループ名も一意でない場合があります。 2 人のユーザーが同じユーザー プリンシパルを持つことができないため、Microsoft Entra ユーザー プリンシパル名は一意になっています。 ただし、アプリ登録 (サービス プリンシパル) は、ユーザー プリンシパル名と同じ表示名で作成できます。

サービス プリンシパルの表示名が重複していない場合は、既定の CREATE LOGIN または CREATE USER ステートメントを使用する必要があります。 WITH OBJECT_ID 拡張機能はパブリック プレビューの段階にあり、一意ではないサービス プリンシパルで使用するために実装されたトラブルシューティングの修復項目です。 一意のサービス プリンシパルで使用する必要はありません。 サフィックスを追加せずにサービス プリンシパルに WITH OBJECT_ID 拡張子を使用すると、正常に実行されますが、ログインまたはユーザーがどのサービス プリンシパルに対して作成されたかは明らかになりません。 サービス プリンシパルを一意に識別するには、サフィックスを使用してエイリアスを作成することをお勧めします。 WITH OBJECT_ID 拡張機能は、SQL Server ではサポートされていません。

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 を使用して作成されたログインまたはユーザーのエイリアスを指定することもできます。 次の例では、アプリケーション オブジェクト ID 4466e2f8-0fea-4c61-a470-xxxxxxxxxxxx を使用してログイン myapp4466e を作成します。

CREATE LOGIN [myapp4466e] FROM EXTERNAL PROVIDER 
  WITH OBJECT_ID = '4466e2f8-0fea-4c61-a470-xxxxxxxxxxxx' 
  • 上記のクエリを実行するには、指定したオブジェクト ID が、Azure 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 LOGIN または CREATE USER ステートメントを使用する場合、ログイン名またはユーザー名には、ユーザー定義のサフィックスによって拡張された元のサービス プリンシパル名が含まれている必要があります。 ベスト プラクティスとして、サフィックスにはオブジェクト ID の最初の部分を含めることができます。 たとえば、オブジェクト ID 2ba6c0a3-cda4-4878-a5ca-xxxxxxxxxxxx の場合は、myapp2ba6c です。 ただし、カスタム サフィックスを定義することもできます。 オブジェクト ID からサフィックスを作成する必要はありません。

この名前付け規則は、データベース ユーザーを明示的に関連付けるか、Microsoft Entra ID のオブジェクトにログインして戻す場合に推奨されます。

Note

エイリアスは、最大長 128 文字を含む sysname の T-SQL 仕様に準拠しています。 サフィックスは、オブジェクト ID の最初の 5 文字に制限することをお勧めします。

Microsoft Entra ID のサービス プリンシパルの表示名は、データベース ログインまたはユーザー エイリアスに同期されません。 CREATE LOGIN または CREATE USER を実行しても、Azure Portal の表示名に影響しません。 同様に、Microsoft Entra ID の表示名を変更しても、データベース ログインやユーザー エイリアスには影響しません。

アプリケーション用に作成されたユーザーを特定する

一意ではないサービス プリンシパルの場合は、Microsoft Entra エイリアスが適切なアプリケーションに関連付けられていることを確認することが重要です。 ユーザーが適切なサービス プリンシパル (アプリケーション) 用に作成されたことをチェックするには:

  1. アプリケーションの アプリケーション ID 、または SQL Database で作成されたユーザーから Microsoft Entra グループのオブジェクト ID を取得します。 次のクエリを参照してください。

    • 作成したユーザーからサービス プリンシパルのアプリケーション ID を取得するには、次のクエリを実行します。

      SELECT CAST(sid as uniqueidentifier) ApplicationID, create_date FROM sys.server_principals WHERE NAME = 'myapp2ba6c' 
      

      出力例:

      Screenshot of SSMS output for the Application ID.

      アプリケーション ID は、指定されたログインまたはユーザー名のセキュリティ ID 番号 (SID) から変換されます。これは、次のクエリを実行し、最後の数桁を比較して日付を作成することで確認できます。

      SELECT SID, create_date FROM sys.server_principals WHERE NAME = 'myapp2ba6c' 
      

      出力例:

      Screenshot of SSMS output for the SID of the application.

    • 作成したユーザーから Microsoft Entra グループのオブジェクト ID を取得するには、次のクエリを実行します。

      SELECT CAST(sid as uniqueidentifier) ObjectID, createdate FROM sys.sysusers WHERE NAME = 'myappgroupd3451b' 
      

      出力例:

      Screenshot of SSMS output for the Object ID of the Microsoft Entra group.

      作成したユーザーから Microsoft Entra グループの SID をチェックするには、次のクエリを実行します。

      SELECT SID, createdate FROM sys.sysusers WHERE NAME = 'myappgroupd3451b' 
      

      出力例:

      Screenshot of SSMS output for the SID of the group.

    • PowerShell を使用してアプリケーションのオブジェクト ID とアプリケーション ID を取得するには、次のコマンドを実行します。

      Get-AzADApplication -DisplayName "myapp2ba6c"
      
  2. Azure portal に移動し、エンタープライズ アプリケーションまたは Microsoft Entra グループ リソースで、プリケーション ID またはオブジェクト ID をそれぞれチェックします。 上記のクエリから取得したものと一致するかどうかを確認します。

Note

サービス プリンシパルからユーザーを作成する場合、CREATE T-SQL ステートメントで WITH OBJECT_ID 句を使用する場合はオブジェクト ID が必要です。 これは、Azure SQL でエイリアスを確認しようとしたときに返されるアプリケーション ID とは異なります。 この検証プロセスを使用すると、Microsoft Entra ID で SQL エイリアスに関連付けられているサービス プリンシパルまたはグループを識別し、オブジェクト ID を持つログインまたはユーザーを作成するときに発生する可能性のある間違いを防ぐことができます。

適切なオブジェクト ID の検索

サービス プリンシパルのオブジェクト ID については、「サービス プリンシパル オブジェクト」を参照してください。 Azure portal の [エンタープライズ アプリケーション] で、アプリケーション名の横にリストされているサービス プリンシパルのオブジェクト ID を見つけることができます。

警告

アプリ登録の[概要] ページで取得したオブジェクト ID は、エンタープライズ アプリケーションの [概要] ページで取得したオブジェクト ID とは異なります。 アプリ登録の [概要] ページで、リンクされた ローカル ディレクトリのマネージド アプリケーションのアプリケーション名を選択して、エンタープライズ アプリケーション [概要] ページの適切なオブジェクト ID に移動します。