我们正在添加一个序列作为列上的默认值。我们希望阻止大多数用户(但不是所有用户)插入自己的值或更新列的值。在大多数情况下,我们需要一个标识列。我们无法添加标识列,因为在添加标识列时会出现锁定问题。该表有90亿行。
我尝试添加一个AFTER触发器来阻止对列的插入和更新,但是我还没有找到一种方法来确定插入的列中的值是否是序列值。此外,该表没有主键或标识行的好方法。
对于大多数但不是所有用户,有没有人知道如何将默认值强制为序列中的下一个值?
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发布于 2020-01-30 12:40:24
为什么不直接定义一个具有适当结构和标识列的新表,然后为这个新表定义SET IDENTITY INSERT ON,这样就可以复制现有的值,然后再定义INSERT INTO new table SELECT * FROM old table。
然后,您将重新设定标识的种子,以便它从先前存在的最大值继续。
https://stackoverflow.com/questions/59977105
复制相似问题