我附加了一个数据库并尝试将所有者更改为有效的登录名。
我使用了以下语句: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 程序集的所有者更改为其他内容,但这不起作用,因为具有依赖程序集的程序集似乎总是需要相同的所有者;但是不可能通过提供的界面同时更改两者的所有者。
- 向 [sa] 调用 GRANT UNSAFE ASSEMBLY;显然,您无法授予该内置帐户以及其他一些帐户的权限;他们已经获得许可
- 调用 GRANT UNSAFE ASSEMBLY 到 [NT AUTHORITY\NETWORK SERVICE](程序集中的帐户调用方法);没有错误,但似乎没有实现任何目标(可能更改了错误号?但消息从未改变)。
- ...可能还有其他一些我不记得的事情。
我相信
ALTER_AUTHORIZATION
并且sp_changedbowner
都可以更改数据库对象的所有权。当然,命令之间的区别在于ALTER_AUTHORIZATION
可以更改其他内容(例如表的所有权),而sp_changedbowner
仅用于更改数据库的所有者。不过,您指出的行为听起来很奇怪。你能复制它吗?
在您的列表中,我认为将数据库设置为不可信,所以我假设您忘记了这一步:
但也许不是...
检查这篇文章: http: //support.microsoft.com/kb/918040似乎他们确实建议使用 sp_changedbowner 而不是 ALTER AUTHORIZATION。但事实是,它做的事情完全相同(sp_changedbowner 在幕后调用 ALTER AUTHORIZATION)。不同之处在于它还删除了 dbo 用户的“别名”(无论如何不推荐使用的功能)加上强制数据库的检查点。最后一块可能是你要找的。