次の方法で共有


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

適用対象:Azure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric SQL Database

この記事では、T-SQL Object_ID 構文を使用して、Azure SQL Database、Fabric SQL Database、Azure SQL Managed Instance で一意でない表示名を持つ Microsoft Entra ログインとユーザーを作成する方法について説明します。

Fabric SQL Database にユーザーを作成することはできますが、ログインは作成することはできません。

概要

Microsoft Entra ID は、サービス プリンシパルの認証をサポートしています。 ただし、Microsoft Entra ID で一意ではない表示名でサービス プリンシパルを使用すると、Azure SQL Database と Azure SQL Managed Instance でログインまたはユーザーを作成するときにエラーが発生します。

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

Microsoft Entra ID の一意ではない表示名のほとんどはサービス プリンシパルに関連していますが、グループ名も一意でない場合があります。 2 人のユーザーが同じユーザー プリンシパルを持つことができないため、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 サンプルでは、アプリケーション オブジェクト ID myapp4466eを使用してログイン aaaaaaaa-0000-1111-2222-bbbbbbbbbbbbを作成します。

CREATE LOGIN [myapp4466e] FROM EXTERNAL PROVIDER 
  WITH OBJECT_ID = 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb' 
  • この T-SQL クエリを実行するには、指定されたオブジェクト 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 myapp2ba6c の場合は、bbbbbbbb-1111-2222-3333-cccccccccccc です。 ただし、カスタム サフィックスを定義することもできます。 オブジェクト ID からサフィックスを形成する必要はありません。

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

エイリアスは、最大長 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' 
      

      出力例:

      アプリケーション ID に対する SQL Server Management Studio (SSMS) クエリ出力のスクリーンショット。

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

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

      出力例:

      アプリケーションの SID に対する SQL Server Management Studio (SSMS) クエリ出力のスクリーンショット。

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

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

      出力例:

      Microsoft Entra グループのオブジェクト ID に対する SQL Server Management Studio (SSMS) クエリ出力のスクリーンショット。

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

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

      出力例:

      グループの SID に対する SQL Server Management Studio (SSMS) クエリ出力のスクリーンショット。

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

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

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

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

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

警告

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