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