これはばかげているように聞こえますが、非常に紛らわしいと思います。MSDN では、定義は SQL Server リソースを要求できるエンティティです。基本的に、Windows レベルのプリンシパル、SQL Server レベルのプリンシパル、データベース レベルのプリンシパルの 3 種類のプリンシパルがあります。ここまでは問題ありません。1 つのプリンシパルの識別子は、このプリンシパルがどのようなタイプであっても、他のものとは異なる必要があるという印象を与えるだけです (これら 3 つのタイプのすべてのプリンシパルを 1 つのテーブルに配置できれば、一意の識別子を持つことになります)
紛らわしい部分は、以下の 3 つのクエリから来ています。
1)
Select name,principal_id from sys.database_principals
(注:1つのデータベースで実行します)
2)
Select name,principal_id from sys.server_principals
これで、最初のものはデータベース ユーザー プリンシパルを返し、2 番目のものはサーバー ユーザー プリンシパルを返すことがわかりました (間違っている場合は修正してください)。しかし、最初のクエリの 1 つの行が、2 番目のクエリの行と同じ principal_id を持つことができるのはなぜでしょうか? たとえば、データベース プリンシパルの 1 行は次のようになります。
名前:INFORMATION_SCHEMA、principal_id: 3
一方、2 番目のクエリの 1 行は
名前:sysadmin、principal_id: 3
これら 2 つの principal_id は何ですか? 前述したように、2 つのプリンシパルの識別子は、1 人が DB ユーザーで、もう 1 人がサーバー ユーザーであっても、異なると思いました (名前から、principal_id が識別子であると想定しています)。
その場合、principal_id がすべてのプリンシパルに対して一意ではなく、各クエリの範囲でのみ一意である場合 (最初のクエリの principal_id はデータベース ユーザーの識別子にすぎないため、サーバー ユーザーのものと同じになる可能性があります)、 3番目のクエリがあり、それが何を意味するのか理解できません:
3)
SELECT
SDP.PRINCIPAL_ID AS [Principal ID],
SDP.NAME AS [Database UserName],
SDP.TYPE_DESC AS [Datebase UserType],
SSP.NAME AS [Server LoginName],
SSP.TYPE_DESC AS [Server LoginType]
FROM sys.database_principals SDP
INNER JOIN sys.server_principals SSP
ON SDP.PRINCIPAL_ID = SSP.PRINCIPAL_ID
2 つの principal_id がその範囲内でのみ一意である場合、両方の principal_id で内部結合を行うとはどういう意味ですか? 内部結合は、この列が共同で一意であることを意味しますよね?
私が誤解している非常に初歩的なことがあるに違いありません。それについて助けてくれてありがとう!