次の方法で共有


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

適用対象: SQL Server 2025 (17.x) Azure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric

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

Fabric SQL データベースにはユーザーを作成できますが、ログインは作成できません。

概要

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

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 が、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 のbbbbbbbb-1111-2222-3333-ccccccccccccとしてのmyapp2ba6c。 ただし、カスタム サフィックスを定義することもできます。 オブジェクト 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 、または Azure SQL または SQL Server で作成されたユーザーから 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 を確認します。 前のクエリから取得したものと一致するかどうかを確認します。

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

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

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

Warnung

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