我想创建一个删除前触发器。当我从表中删除一条记录时,该记录必须插入到历史表中。如何在 SQL Server 中执行此操作?
问问题
83093 次
4 回答
37
在这种情况下,您最好进行常规的“后”触发。这是处理此类情况的最常见方法。
就像是
CREATE TRIGGER TRG_AUD_DEL
ON yourTable
FOR DELETE
AS
INSERT INTO my_audit_table (col1, col2, ...)
SELECT col1, col2...
FROM DELETED
将会发生的情况是,当从表中删除一条记录(或多条记录!)时,删除的行将插入到my_audit_table
该DELETED
表是一个虚拟表,其中包含删除前的记录。
另外,请注意触发器作为删除语句上隐式事务的一部分运行,因此如果您的删除失败并回滚,触发器也会回滚。
于 2012-05-04T06:34:14.447 回答
16
你也可以使用INSTEAD OF DELETE
CREATE TRIGGER dbo.SomeTableYouWhatToDeleteFrom
ON dbo.YourTable
INSTEAD OF DELETE
AS
BEGIN
-- Some code you want to do before delete
DELETE YourTable
FROM DELETED D
INNER JOIN dbo.YourTable T ON T.PK_1 = D.PK_1
END
于 2012-05-04T06:36:06.167 回答
1
可以通过以下步骤完成,例如在此示例中我使用的是客户表:
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25) ,
LAST_UPDATED DATETIME,
PRIMARY KEY (ID)
);
创建历史:
CREATE TABLE CUSTOMERS_HIST( ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL, ADDRESS CHAR (25) , LAST_UPDATED DATETIME, PRIMARY KEY (ID) );
在删除事件上触发源表,如下所示:
CREATE TRIGGER TRG_CUSTOMERS_DEL ON CUSTOMERS FOR DELETE AS INSERT INTO CUSTOMERS_HIST (ID, NAME, AGE, ADDRESS, LAST_UPDATED) SELECT ID, NAME, AGE, ADDRESS, LAST_UPDATED FROM DELETED
于 2015-10-28T09:14:27.010 回答
0
尝试在删除之前执行的触发器,并在不满足条件时抛出错误。
CREATE TRIGGER [dbo].[TableName_PreventDeleteAndUpdate]
ON dbo.TableName
FOR DELETE, UPDATE -- runs before deletes and updates
AS
BEGIN
IF (APP_NAME() <> 'SomeApp')
BEGIN
RAISERROR ('Only delete/update with SomeApp', 16, 1);
ROLLBACK TRANSACTION;
RETURN;
END
END
于 2022-01-31T08:44:27.687 回答