【问题标题】:Setting Identity to on or off in SQL server在 SQL Server 中将身份设置为打开或关闭
【发布时间】:2013-02-25 10:50:48
【问题描述】:

我想将列的 Is Identity 属性设置为关闭,并在插入显式值后再次将其设置为打开。我已经编写了以下查询:

SET IDENTITY_INSERT Tbl_Cartoons OFF

虽然执行成功,但表格设计没有任何变化。 请提出解决方案,这真的很关键。

【问题讨论】:

    标签: sql sql-server sql-server-2008 sql-server-2005


    【解决方案1】:

    您实际上想在尝试插入显式值之前使用SET IDENTITY_INSERT Tbl_Cartoons ON

    您是说“将负责将值插入IDENTITY 列”。

    SET IDENTITY_INSERT Tbl_Cartoons OFF 说“我会让系统负责将值插入IDENTITY 列”。

    【讨论】:

      【解决方案2】:

      要将显式值插入标识列,请执行以下操作:

      SET IDENTITY_INSERT Tbl_Cartoons  ON
      GO
      
      -- code to insert explicit ID values
      
      SET IDENTITY_INSERT Tbl_Cartoons  OFF
      GO
      

      【讨论】:

        【解决方案3】:

        您给出的所有行都是禁用标识,以便您可以将特定值插入标识列 - 通常这是一次性的,例如移动数据。身份仍然存在于列上,只是没有被执行。从概念上讲,这类似于禁用和删除触发器之间的区别。

        从列中完全删除标识更难。 The question covers it,但基本思想是您必须创建一个新列,将数据复制过来,然后删除标识列。

        【讨论】:

          【解决方案4】:

          设置SET IDENTITY_INSERT 的会话允许输入显式值。

          但该列仍然是一个标识列。只是你的会话可以忽略身份约束。

          【讨论】:

            【解决方案5】:

            将 identity_insert 设置为 on 以便能够显式设置 id 列的值。再次将其设置为自动分配。

            【讨论】:

              【解决方案6】:

              可以关闭 Identity 属性,但它涉及编辑系统表,这不是一个好的做法。 您也不太可能拥有必要的权限,并且可能会看到 You do not have permission to run the RECONFIGURE statement 尝试以下代码:

              DECLARE @tableName nvarchar(128) = 'YourTable';
              
              -- Get a list of identity columns (informational)
              SELECT OBJECT_NAME(object_id) tableName, sc.name colName, st.name dataType
              FROM sys.columns sc
              JOIN sys.types st
                  ON st.system_type_id = sc.system_type_id
              WHERE sc.is_identity = 1
              AND OBJECT_NAME(object_id) = @tableName
              
              -- Allow ad-hoc changes to system catalogs
              EXEC  sp_configure 'allow update', 1
              GO
              reconfigure with override
              GO
              -- Eliminate the identityness
              UPDATE syscolumns SET colstat = colstat - 1
              WHERE id = object_id(@tableName)
              AND name = 'Id' -- Specify column if you like, though only one identity per table is currently supported
              GO
              -- Unallow ad-hoc changes to system catalogs
              exec sp_configure 'allow update', 0
              GO
              reconfigure with override
              GO
              

              【讨论】:

                猜你喜欢
                • 2013-05-17
                • 2021-04-15
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-04-08
                • 1970-01-01
                相关资源
                最近更新 更多