首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >阻止对缺省值列执行插入/更新操作

阻止对缺省值列执行插入/更新操作
EN

Stack Overflow用户
提问于 2020-01-30 07:31:52
回答 1查看 111关注 0票数 0

我们正在添加一个序列作为列上的默认值。我们希望阻止大多数用户(但不是所有用户)插入自己的值或更新列的值。在大多数情况下,我们需要一个标识列。我们无法添加标识列,因为在添加标识列时会出现锁定问题。该表有90亿行。

我尝试添加一个AFTER触发器来阻止对列的插入和更新,但是我还没有找到一种方法来确定插入的列中的值是否是序列值。此外,该表没有主键或标识行的好方法。

对于大多数但不是所有用户,有没有人知道如何将默认值强制为序列中的下一个值?

代码语言:javascript
复制
IF OBJECT_ID('dbo.BankId','SO') IS NOT NULL
       DROP SEQUENCE dbo.BankId;


CREATE SEQUENCE BankId
AS BIGINT
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
NO CYCLE
CACHE 10000;


alter table BankImport
add BankId bigint default next value for BankId;
alter table Bank
add BankId bigint default next value for BankId;
alter table BankImportHold
add BankId bigint default next value for BankId;
alter table Bankarchive
add BankId bigint default next value for BankId;


IF OBJECT_ID ('BankEnforceID','TR') IS NOT NULL
   DROP TRIGGER BankEnforceID;
GO

CREATE TRIGGER dbo.BankEnforceID ON bank
AFTER INSERT
AS
IF EXISTS (SELECT *
           FROM inserted AS i
           where i.BankID is not NULL
          )
BEGIN
RAISERROR ('Cannot specify a value for BankID', 16, 1);
ROLLBACK TRANSACTION;
RETURN 
END;
GO
EN

回答 1

Stack Overflow用户

发布于 2020-01-30 12:40:24

为什么不直接定义一个具有适当结构和标识列的新表,然后为这个新表定义SET IDENTITY INSERT ON,这样就可以复制现有的值,然后再定义INSERT INTO new table SELECT * FROM old table

然后,您将重新设定标识的种子,以便它从先前存在的最大值继续。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59977105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档