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.
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.