web-dev-qa-db-fra.com

Quelle est la signification de la principale_id dans Sys.schemas?

Quelle est la signification du principal_id dans sys.schemas Et quand serait-il jamais différent de 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)

En interne, je vois que le schema_id vient de sys.sysclsobjs tandis que le principal_id vient de sys.syssingleobjrefs 's r.indepid domaine.

4
Evan Carroll

Il devrait être le "propriétaire" par défaut de tous les objets du schéma. Les objets liés au schéma ont un principal_id colonne qui est NULL par défaut, auquel cas il utilise le principal_id du schéma que l'objet est dans.

Le propriétaire de l'objet est utilisé pour le chaînage de propriété, et très probablement également lors de la détermination du cas de droits pour effectuer des opérations pouvant être effectuées par le propriétaire de l'objet ou un utilisateur dans un db_owner Rôle de base de données, telle que TRONCATE TABLE , SET ITY IDENTITY_INSERT , etc.

Le principal_id dans sys.schemas peut être n'importe quel utilisateur si modifié via Alter autorisation .

Si vous utilisez des schémas pour la séparation logique des objets plus que la séparation de la sécurité, il serait logique d'utiliser le même principal_id à travers plusieurs schémas. Par exemple, exécutant ce qui suit dans le AdventureWorks2012 Base de données:

SELECT * FROM sys.schemas;

montre que les schémas suivants appartiennent tous à "DBO":

dbo
HumanResources
Person
Production
Purchasing
Sales

Avoir le même "propriétaire" sur Sales et Purchasing (et les autres) permet la tenue de la propriété d'impliquer des autorisations d'objets référencés dans des objets de niveau supérieur. Signification, si vous exécutez une procédure stockée dans le schéma Sales, et il sélectionne à partir d'une vue dans le schéma Purchasing, puis les autorisations ne seront pas à nouveau vérifiées et tout fonctionne simplement. Mais si vous spécifiez alors le principal_id de la vue dans le schéma Purchasing tel que la colonne ne soit plus NULL (et non identique à l'utilisateur "DBO"), il revérifiera les autorisations pour voir si le L'utilisateur exécutant la procédure stockée a SELECT autorisations à cette vue.

5
Solomon Rutzky