sys.schemas 中的 principal_id 有什么意义?

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.syssingleobjrefsr.indepid字段。

Sol*_*zky 6

它应该是架构中所有对象的默认“所有者”。模式绑定对象有一个默认的principal_idNULL,在这种情况下,它使用principal_id对象所在模式的 。

对象所有者用于所有权链接,并且很可能还用于确定是否存在执行可由对象所有者或db_owner数据库角色中的用户完成的操作的权限,例如TRUNCATE TABLESET IDENTITY_INSERT等。

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

SalesPurchasing(和其他)拥有相同的“所有者”允许所有权链接暗示顶级对象内引用对象的权限。这意味着,如果您在Sales架构中执行存储过程,并且它从Purchasing架构中的视图中进行选择,则不会重新检查权限并且一切正常。但是,如果您随后principal_idPurchasing架构中指定视图的,使得该列不再NULL(并且与“dbo”用户不同),那么它将重新检查权限以查看执行存储过程的用户是否具有SELECT权限在那个视图上。

  • 不,我不是这么说的。在 SQL Server 2005 之前没有架构,所以 blah.ObjectName 是“owner”==“blah”。但从 2005 年开始,他们添加了作为对象容器的架构。这些容器与用户相关联,但本身不是用户。 (4认同)