我附加了一个数据库并尝试将其所有者更改为有效登录名。
我使用了语句:ALTER AUTHORIZATION ON database::my_db_name TO "sa"。数据库属性显示新所有者是“sa”,但我仍然收到不受限制的 CLR 程序集 (0x80FC80F1、0x8013150A) 的权限错误,这是有关程序集信任问题的一些信息。
我通过使用以下语句解决了该问题:EXEC sp_changedbowner 'sa'; 来更改数据库所有者。
我的问题是,这两种更改数据库所有者的方法有什么区别。它们等价吗?在我看来,sp_changedbowner 所做的比 alter authorization 语句所做的更多/更正确。
如果您感兴趣的话...在使用 sp_changedbowner 修复问题之前,我尝试过:
- 将数据库的可信属性设置为 ON;事实上,我这样做过几次;我知道这是运行不受限制、未签名的自定义 CLR 程序集的要求
- 将每个 CLR 程序集的所有者更改为 dbo,因为所有者为空,但显然 dbo 已经是所有者,并且在 SSMS 中它始终为空。
- 将每个 CLR 程序集的所有者更改为其他所有者,但这是行不通的,因为具有依赖程序集的程序集似乎总是需要相同的所有者;但是不可能使用提供的接口同时更改两者的所有者。
- 调用 GRANT UNSAFE ASSEMBLY 给 [sa];显然你不能向该内置帐户以及其他几个帐户授予权限;他们已经拥有权限
- 向 [NT AUTHORITY\NETWORK SERVICE] 调用 GRANT UNSAFE ASSEMBLY(程序集中的帐户调用方法);没有错误,但似乎没有实现任何事情(可能改变了错误号?但消息从未改变)。
- ...可能还有一些我记不清的事情。
答案1
在您的列表中,我认为设置数据库并不可信,因此我认为您忘记了这一步:
ALTER DATABASE my_db_name SET TRUSTWORTHY ON;
但也许不是...
参照这篇文章进行检查:http://support.microsoft.com/kb/918040看来他们确实建议使用 sp_changedbowner 而不是 ALTER AUTHORIZATION。但事实是,它的作用完全相同(sp_changedbowner 在幕后调用 ALTER AUTHORIZATION)。不同之处在于它还会删除 dbo 用户的“别名”(无论如何,这是已弃用的功能),并强制执行数据库检查点。最后一部分可能就是您要找的。
答案2
我相信ALTER_AUTHORIZATION
和sp_changedbowner
都可以更改数据库对象的所有权。当然,这两个命令之间的区别在于,ALTER_AUTHORIZATION
可以更改其他内容(例如表的所有权),而sp_changedbowner
只能更改数据库的所有者。
不过,您指出的行为听起来很奇怪。您可以复制它吗?