我们最近提出了一个问题,即dbo
数据库中的用户与 in不sid
匹配。我了解数据库的所有者与角色成员的不同之处,但我一直认为用户是数据库的实际所有者。不是这样吗?如果是这样,两者之间有什么真正的区别吗?owner_sid
sys.databases
db_owner
dbo
dbo
sys.databases
我们最近提出了一个问题,即dbo
数据库中的用户与 in不sid
匹配。我了解数据库的所有者与角色成员的不同之处,但我一直认为用户是数据库的实际所有者。不是这样吗?如果是这样,两者之间有什么真正的区别吗?owner_sid
sys.databases
db_owner
dbo
dbo
sys.databases
那是(或至少应该是)正确的。该用户的名称“dbo”永远不会改变,但基础 SID 取决于谁创建了数据库,或者通过sp_changedbowner(尽管包括 SQL Server 2005)或ALTER AUTHORIZATION(从 SQL 开始)设置为谁服务器 2008)。
在所有这三种情况下,记录
sys.databases
也被更改,以便它们保持同步。但是,当从另一个系统或从同一实例但从在执行这 2 个 SQL 命令之一以更改所有者之前备份/分离的数据库恢复数据库时,然后在 RESTORE 或附加时,将是该数据库中的owner_sid
列sys.databases
与“dbo”之间的不匹配。sid
sys.database_principals
据我所知,
sys.database_principals
每个数据库中的记录是真正的所有者,而owner_sid
列中的列sys.databases
是记录保存/方便的问题(类似于非规范化;如果没有sys.databases
系统,则需要对所有数据库进行单独查询以获取该信息,每次请求!)和安全性。它用于识别潜在有害/无效恢复/附加数据库的一件事是那些记录不匹配。尝试访问标记为或者不会加载的 SQLCLR 程序EXTERNAL_ACCESS
集UNSAFE
,如果一个人选择了不太安全的启用路径,TRUSTWORTHY
因为它依赖于“dbo”SID,因为它需要匹配具有或的登录EXTERNAL ACCESS ASSEMBLY
名UNSAFE ASSEMBLY
允许。当这两个系统目录视图之间的 SID 不匹配时,无法确定使用哪一个,并用作存在潜在安全问题的危险信号。事实上,我在SQL#的安装脚本中测试了这种情况,以提醒某人进行适当的更改,这样他们就不必浪费时间寻找它,以防 SQL Server 在某些时候抱怨它。