Answers:
我一直认为用户
dbo
是数据库的实际所有者。
那是(或者至少应该是)正确的。该用户的名称“ dbo”从不更改,但基础SID会根据创建数据库的人或通过sp_changedbowner(虽然包括SQL Server 2005在内)或通过ALTER AUTHORIZATION(从SQL开始)设置为谁来进行更改 Server 2008)。
在所有这三种情况下,记录中的sys.databases
内容也会更改,以使它们保持同步。但是,从另一个系统或同一实例,但从在执行这2条SQL命令之一更改所有者之前已备份/分离的数据库中还原数据库时,则在还原或附加时,将是之间的失配owner_sid
在列sys.databases
和“DBO” sid
在sys.database_principals
该DB。
据我所知,sys.database_principals
每个数据库中的记录都是真正的所有者,其中的owner_sid
列sys.databases
是记录保存/方便性的问题(类似于非规范化;如果没有sys.databases
系统,则需要跨所有数据库进行单独查询以获取该信息,每次都要求!)和安全性。它的作用是识别那些记录不匹配的潜在有害/无效的恢复/附加数据库。尝试访问标记为EXTERNAL_ACCESS
或的SQLCLR程序集,UNSAFE
如果一个人选择走不太安全的启用路线,则TRUSTWORTHY
该程序集将依赖于“ dbo” SID,因为它需要与具有“或” EXTERNAL ACCESS ASSEMBLY
或“UNSAFE ASSEMBLY
允许。并且,当这两个系统目录视图之间的SID不匹配时,就无法确定要使用哪个视图,并且会被用作危险信号的红旗。实际上,我在SQL#的安装脚本中测试了这种情况,以提醒某人进行适当的更改,以免他们浪费时间寻找它,以防SQL Server在某个时候抱怨它。