2014-01-17 45 views
0

看看下面的输入:如何解决此类错误:“系统目录不允许临时更新”。

update sys.assemblies set permission_set_desc = 'EXTERNAL_ACCESS' where 
assembly_id = <someInt> and name not like 'microsoft%' 

及以下的输出:

Msg 259, Level 16, State 1, Line 2 
Ad hoc updates to system catalogs are not allowed. 

这是在SQL Server 2012中,我登录为“sa”的,所以这可能是不是用户权限问题。我在Google上发现的链接要么没有解决方案,要么难以遵循。如何在不对数据库产生不必要的永久性更改的情况下通过此操作?谢谢!

EDIT

对不起,我意外地复制和粘贴从错误的窗口输入和输出。我删除了我真正遇到的麻烦,所以我不能找到它是什么。尽管我遇到了麻烦,但第一条评论解决了这个问题。我不记得现在到底是什么,但我很快就从一件事变成另一件事......如果我记得我后来看到的是什么,我会解决这个问题,但我会继续处理这个问题现在是。

+2

使用“ALTER ASSEMBLY”或“GRANT”等命令。 –

+0

无理由倒票?这并不像我在发布之前没有找到它。 – Panzercrisis

+0

不是我,但猜测可能是关于这项研究。谷歌搜索该错误消息的第二次击中[这个问题](http://stackoverflow.com/questions/15329764/ad-hoc-updates-to-system-catalogs-are-not-allowed),这清楚地解释说你不能(或者至少不应该,即使你足够勇于在单用户模式下尝试DAC)用UPDATE语句来做这种事情。 –

回答

4

您不能更新系统目录,就像错误消息所述。自从SQL Server 2000以来,你一直无法做到这一点,甚至在那些牛仔时代,这也不是一个好主意。像戈登说的那样,你需要这样做,就是使用ALTER ASSEMBLY。如果你只有一个单一的组件更新:

ALTER ASSEMBLY [assembly name] WITH PERMISSION_SET = EXTERNAL_ACCESS; 

如果你有多重,你可以使用动态SQL生成的脚本:

DECLARE @sql NVARCHAR(MAX) = N''; 

SELECT @sql += N'ALTER ASSEMBLY ' + QUOTENAME(name) 
    + ' WITH PERMISSION_SET = EXTERNAL_ACCESS; 
    ' 
FROM sys.assemblies WHERE assembly_id = <someInt>; -- or IN (<some range>) 

PRINT @sql; 
-- EXEC sp_executesql @sql; 

我不认为你需要过滤掉微软如果您提供了特定的assembly_id

相关问题