Microsoft Entra ログインと一意ではない表示名を持つユーザー (プレビュー)
適用対象: Azure SQL Database Azure SQL Managed Instance Microsoft Fabric SQL Database
この記事では、T-SQL Object_ID
構文を使用して、Azure SQL Database、Fabric SQL Database、Azure SQL Managed Instance で一意でない表示名を持つ Microsoft Entra ログインとユーザーを作成する方法について説明します。
Note
Azure SQL でユーザーおよびログインを作成するための WITH OBJECT_ID
の使用は、現在プレビュー段階です。
Fabric SQL Database にユーザーを作成することはできますが、ログインは作成することはできません。
概要
Microsoft Entra ID は、サービス プリンシパルの認証をサポートしています。 ただし、Microsoft Entra ID で一意ではない表示名を持つサービス プリンシパルを使用すると、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 アプリケーション (サービス プリンシパル) の表示名が重複しているのに対し、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 の最初の部分を含めることができます。 たとえば、オブジェクト ID2ba6c0a3-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 エイリアスが適切なアプリケーションに関連付けられていることを確認することが重要です。 ユーザーが適切なサービス プリンシパル (アプリケーション) 用に作成されたことをチェックするには:
アプリケーションの アプリケーション ID 、または SQL Database で作成されたユーザーから Microsoft Entra グループのオブジェクト ID を取得します。 次のクエリを参照してください。
作成したユーザーからサービス プリンシパルのアプリケーション ID を取得するには、次のクエリを実行します。
SELECT CAST(sid as uniqueidentifier) ApplicationID, create_date FROM sys.server_principals WHERE NAME = 'myapp2ba6c'
出力例:
アプリケーション ID は、指定されたログインまたはユーザー名のセキュリティ ID 番号 (SID) から変換されます。これは、次のクエリを実行し、最後の数桁を比較して日付を作成することで確認できます。
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'
出力例:
PowerShell を使用してアプリケーションのオブジェクト ID とアプリケーション ID を取得するには、次のコマンドを実行します。
Get-AzADApplication -DisplayName "myapp2ba6c"
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 に移動します。