7

これはばかげているように聞こえますが、非常に紛らわしいと思います。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 で内部結合を行うとはどういう意味ですか? 内部結合は、この列が共同で一意であることを意味しますよね?

私が誤解している非常に初歩的なことがあるに違いありません。それについて助けてくれてありがとう!

4

1 に答える 1

9

principal_ids onsys.database_principalsとの間に対応はありませんsys.server_principals。最初に、データベース内で一意であることが文書化されているだけです。2 つ目は、サーバー全体で一意です。また、同じビュー内のこれらの列の間に文書化された関係はありません。

実際、番号principal_idの小さい は両方のビューで割り当てられる可能性が高く、それらが関連するプリンシパルは無関係です。

したがって、使用する 2 つのビュー間の結合を示すクエリprincipal_idは間違っています。

于 2012-11-09T15:20:53.837 に答える