用户dbo和sys.databases中存储的数据库所有者之间有什么区别


11

最近,我们遇到一个问题dbo,即数据库中的用户使用的in sidowner_sidin 不匹配sys.databases。我了解数据库的所有者与角色成员有何不同,db_owner但我一直认为用户dbo是数据库的实际所有者。不是吗?如果是的话有没有之间的任何真正的差异dbo,什么是中sys.databases

Answers:


8

我一直认为用户dbo是数据库的实际所有者。

那是(或者至少应该是)正确的。该用户的名称“ dbo”从不更改,但基础SID会根据创建数据库的人或通过sp_changedbowner(虽然包括SQL Server 2005在内)或通过ALTER AUTHORIZATION(从SQL开始)设置为谁来进行更改 Server 2008)。

在所有这三种情况下,记录中的sys.databases内容也会更改,以使它们保持同步。但是,从另一个系统或同一实例,但从在执行这2条SQL命令之一更改所有者之前已备份/分离的数据库中还原数据库时,则在还原或附加时,将是之间的失配owner_sid在列sys.databases和“DBO” sidsys.database_principals该DB。

据我所知,sys.database_principals每个数据库中的记录都是真正的所有者,其中的owner_sidsys.databases是记录保存/方便性的问题(类似于非规范化;如果没有sys.databases系统,则需要跨所有数据库进行单独查询以获取该信息,每次都要求!)和安全性。它的作用是识别那些记录不匹配的潜在有害/无效的恢复/附加数据库。尝试访问标记为EXTERNAL_ACCESS或的SQLCLR程序集,UNSAFE如果一个人选择走不太安全的启用路线,则TRUSTWORTHY该程序集将依赖于“ dbo” SID,因为它需要与具有“或” EXTERNAL ACCESS ASSEMBLY或“UNSAFE ASSEMBLY允许。并且,当这两个系统目录视图之间的SID不匹配时,就无法确定要使用哪个视图,并且会被用作危险信号的红旗。实际上,我在SQL#的安装脚本中测试了这种情况,以提醒某人进行适当的更改,以免他们浪费时间寻找它,以防SQL Server在某个时候抱怨它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.