SQL Server 2012 中不允许对系统目录进行临时更新

Posted

技术标签:

【中文标题】SQL Server 2012 中不允许对系统目录进行临时更新【英文标题】:Ad hoc updates to system catalogs are not allowed in SQL Server 2012 【发布时间】:2015-12-17 13:44:24 【问题描述】:

我想通过像这样更新它来从列中删除身份..

sp_configure 'allow update', 1 
go 

reconfigure with override 
go

update sys.syscolumns 
set colstat = 0    -- turn off bit 1 which indicates identity column 
where id = object_id('tbl1') and name = 'ids'
go

sp_configure 'allow updates', 0 
go 

reconfigure 
go

我遇到了这个错误,尝试了很多次。

消息 259,第 16 级,状态 1,第 15 行 不允许对系统目录进行临时更新。

【问题讨论】:

这里有很多建议的解决方案:google.com/… 嗯 - 错误非常清楚地说明了一切:不允许更新系统目录 - 这些是系统级目录视图 - 你没有业务在其中摆弄并尝试更新内容-这些视图反映了您系统的实际情况-如果您想更改某些内容-在相应的数据库对象中更改它(此处:tbl1)-不在系统目录中查看! 说真的,这样做可能会破坏某些东西。只需drop and recreate the table。 我想以任何方式执行此操作,我只是想从列中删除身份属性。 【参考方案1】:

如果你想完全摆脱它,只需重命名表,然后将数据转储到新表中。

EXEC sp_rename 'OriginalTblName','OLD_OriginalTblName'

CREATE TABLE OriginalTblName (Definition of your Table)

INSERT OriginalTblName
SELECT * FROM OLD_OriginalTblName

如果您愿意,只需将内容选择到新表中即可跳过CREATE TABLE 步骤。您无法使用此方法以您想要的方式定义字段。

SELECT * FROM OLD_OriginalTblName
INTO OriginalTblName

如果你只是想INSERT新记录,你可以使用IDENTITY INSERT插入你想要的记录。请注意不要重复这些值,否则您会破坏表格。

SET IDENTITY_INSERT ON OriginalTblName

INSERT OriginalTblName
SELECT someFields
FROM someTbl

SET IDENTITY_INSERT OFF OriginalTblName

IDENTITY INSERT 不适用于 UPDATE 字段上的 IDENTITY。您需要使用上述方法之一捕获数据并重新插入记录。

【讨论】:

以上是关于SQL Server 2012 中不允许对系统目录进行临时更新的主要内容,如果未能解决你的问题,请参考以下文章

Ctrl R 在 SQL Server 2012 中不起作用

SQL Server 2012允许远程连接(Windows Server 2016)

Win10 下卸载sql server 2012的问题

vCenter 6.5U1 Windows SQL Server 2012 安装

Sql Server 2012 上的“不允许启动新请求,因为它应该带有有效的事务描述符”

Intellisense 在 SQL Server Management Studio 中不起作用。可能是啥原因?