在 SQL Server 2008 中更改数据库所有者;CLR 问题取决于使用的方法?

Tri*_*nko 7 security permissions database-administration sql-server

我附加了一个数据库并尝试将所有者更改为有效的登录名。

我使用了语句:ALTER AUTHORIZATION ON database::my_db_name TO "sa"。数据库属性显示新所有者是“sa”,但是我仍然收到不受限制的 CLR 程序集(0x80FC80F1、0x8013150A)的权限错误,这与程序集信任问题有关。

我改用以下语句解决了这个问题: EXEC sp_changedbowner 'sa'; 更改数据库所有者。

我的问题是,这两种更改数据库所有者的方法有什么区别。它们是等价的吗?我似乎很清楚 sp_changedbowner 正在做更多/正确的事情,而更改授权声明没有做。


如果您有兴趣...在使用 sp_changedbowner 修复问题之前,我尝试过:

  • 将数据库的可信属性设置为 ON;事实上,我这样做了几次;我知道运行不受限制的、未签名的自定义 CLR 程序集是必需的
  • 将每个 CLR 程序集的所有者更改为 dbo,因为所有者是空白的,但显然 dbo 已经是所有者,并且在 SSMS 中它始终是空白的。
  • 将每个 CLR 程序集的所有者更改为其他内容,但这不起作用,因为具有依赖程序集的程序集似乎总是需要相同的所有者;但是不可能通过提供的界面同时更改所有者。
  • 调用 GRANT UNSAFE ASSEMBLY 到 [sa];显然,您无法授予该内置帐户以及其他一些帐户的权限;他们已经获得许可
  • 将 GRANT UNSAFE ASSEMBLY 调用到 [NT AUTHORITY\NETWORK SERVICE](程序集中的帐户调用方法);没有错误,但似乎没有实现任何目标(可能更改了错误编号?尽管消息从未更改)。
  • ...可能还有一些我不记得的事情。

use*_*734 3

在您的列表中,我没有看到将数据库设置为值得信赖的,因此我假设您忘记了此步骤:

ALTER DATABASE my_db_name SET TRUSTWORTHY ON;
Run Code Online (Sandbox Code Playgroud)

但也许不是...

检查这篇文章:http://support.microsoft.com/kb/918040看来他们确实建议使用 sp_changedbowner 而不是 ALTER AUTHORIZATION。但事实是,它执行完全相同的操作(sp_changedbowner 在幕后调用 ALTER AUTHORIZATION)。不同之处在于,它还删除了 dbo 用户的“别名”(无论如何已弃用的功能)并强制设置数据库检查点。最后一件作品可能就是您正在寻找的作品。