【问题标题】:Ad hoc updates to system catalogs are not allowed in SQL Server 2012SQL 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
  • 我想以任何方式执行此操作,我只是想从列中删除身份属性。

标签: sql sql-server


【解决方案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。您需要使用上述方法之一捕获数据并重新插入记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-11
    • 2011-06-08
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 2017-11-04
    • 2022-01-12
    相关资源
    最近更新 更多