Eva*_*oll 5 schema sql-server database-internals users catalogs
principal_idin的含义是什么?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)
Run Code Online (Sandbox Code Playgroud)
在内部,我看到 the schema_idcome from sys.sysclsobjswhile the principal_idcome fromsys.syssingleobjrefs的r.indepid字段。
它应该是架构中所有对象的默认“所有者”。模式绑定对象有一个默认的principal_id列NULL,在这种情况下,它使用principal_id对象所在模式的 。
对象所有者用于所有权链接,并且很可能还用于确定是否存在执行可由对象所有者或db_owner数据库角色中的用户完成的操作的权限,例如TRUNCATE TABLE、SET IDENTITY_INSERT等。
在principal_id中sys.schemas,如果通过改变可以是任何用户ALTER授权。
如果使用架构进行对象的逻辑分离而不是安全分离,那么principal_id在多个架构中使用相同的架构是有意义的。例如,在AdventureWorks2012数据库中执行以下操作:
SELECT * FROM sys.schemas;
Run Code Online (Sandbox Code Playgroud)
显示以下架构都归“dbo”所有:
SELECT * FROM sys.schemas;
Run Code Online (Sandbox Code Playgroud)
跨Sales和Purchasing(和其他)拥有相同的“所有者”允许所有权链接暗示顶级对象内引用对象的权限。这意味着,如果您在Sales架构中执行存储过程,并且它从Purchasing架构中的视图中进行选择,则不会重新检查权限并且一切正常。但是,如果您随后principal_id在Purchasing架构中指定视图的,使得该列不再NULL(并且与“dbo”用户不同),那么它将重新检查权限以查看执行存储过程的用户是否具有SELECT权限在那个视图上。