web-dev-qa-db-ja.com

sys.schemasのprincipal_idの意味は何ですか?

principal_idsys.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_idsys.sysclsobjsから取得され、principal_idsys.syssingleobjrefsr.indepidフィールドから取得されています。

4
Evan Carroll

これは、スキーマ内のすべてのオブジェクトのデフォルトの「所有者」である必要があります。スキーマバインドオブジェクトには、デフォルトでNULLであるprincipal_id列があります。この場合、オブジェクトが含まれているスキーマのprincipal_idが使用されます。

オブジェクト所有者は、所有権の連鎖に使用されます。また、オブジェクト所有者またはdb_ownerデータベースロール内のユーザーが実行できる操作を実行する権限が存在するかどうかを判断する場合にも、 TRUNCATEなど) TABLESET IDENTITY_INSERT など.

principal_idsys.schemasは、 ALTER AUTHORIZATION で変更した場合、任意のユーザーにすることができます。

オブジェクトを論理的に分離するためにセキュリティの分離よりもスキーマを使用する場合、複数のスキーマで同じprincipal_idを使用することは理にかなっています。たとえば、AdventureWorks2012データベースで以下を実行します。

SELECT * FROM sys.schemas;

次のスキーマはすべて「dbo」が所有していることを示しています。

dbo
HumanResources
Person
Production
Purchasing
Sales

SalesPurchasing(およびその他)で同じ「所有者」を持つことにより、所有権の連鎖がトップレベルのオブジェクト内の参照されるオブジェクトの権限を意味するようになります。つまり、Salesスキーマでストアドプロシージャを実行し、Purchasingスキーマのビューから選択した場合、権限は再チェックされず、すべてが機能します。ただし、次にPurchasingスキーマでビューのprincipal_idを指定して、列がNULLにならないようにします(「dbo」ユーザーとは異なります)。ストアドプロシージャを実行しているユーザーがそのビューに対してSELECT権限を持っているかどうかを確認するために、権限を再確認します。

5
Solomon Rutzky