principal_id
のsys.schemas
の意味は何ですか。また、いつschema_id
と異なるのですか?
1> SELECT LEFT(name,20), schema_id, principal_id FROM sys.schemas;
2> GO
schema_id principal_id
-------------------- ----------- ------------
dbo 1 1
guest 2 2
INFORMATION_SCHEMA 3 3
sys 4 4
db_owner 16384 16384
db_accessadmin 16385 16385
db_securityadmin 16386 16386
db_ddladmin 16387 16387
db_backupoperator 16389 16389
db_datareader 16390 16390
db_datawriter 16391 16391
db_denydatareader 16392 16392
db_denydatawriter 16393 16393
(13 rows affected)
内部的には、schema_id
はsys.sysclsobjs
から取得され、principal_id
はsys.syssingleobjrefs
のr.indepid
フィールドから取得されています。
これは、スキーマ内のすべてのオブジェクトのデフォルトの「所有者」である必要があります。スキーマバインドオブジェクトには、デフォルトでNULL
であるprincipal_id
列があります。この場合、オブジェクトが含まれているスキーマのprincipal_id
が使用されます。
オブジェクト所有者は、所有権の連鎖に使用されます。また、オブジェクト所有者またはdb_owner
データベースロール内のユーザーが実行できる操作を実行する権限が存在するかどうかを判断する場合にも、 TRUNCATEなど) TABLE 、 SET IDENTITY_INSERT など.
principal_id
のsys.schemas
は、 ALTER AUTHORIZATION で変更した場合、任意のユーザーにすることができます。
オブジェクトを論理的に分離するためにセキュリティの分離よりもスキーマを使用する場合、複数のスキーマで同じprincipal_id
を使用することは理にかなっています。たとえば、AdventureWorks2012
データベースで以下を実行します。
SELECT * FROM sys.schemas;
次のスキーマはすべて「dbo」が所有していることを示しています。
dbo
HumanResources
Person
Production
Purchasing
Sales
Sales
とPurchasing
(およびその他)で同じ「所有者」を持つことにより、所有権の連鎖がトップレベルのオブジェクト内の参照されるオブジェクトの権限を意味するようになります。つまり、Sales
スキーマでストアドプロシージャを実行し、Purchasing
スキーマのビューから選択した場合、権限は再チェックされず、すべてが機能します。ただし、次にPurchasing
スキーマでビューのprincipal_id
を指定して、列がNULL
にならないようにします(「dbo」ユーザーとは異なります)。ストアドプロシージャを実行しているユーザーがそのビューに対してSELECT
権限を持っているかどうかを確認するために、権限を再確認します。