我想创建一个before删除触发器。当我从表中删除记录时,必须将记录插入到历史记录表中。我如何在SQL Server中执行此操作?如何在SQL Server中创建before delete触发器?
19
A
回答
29
在这种情况下,你可能触发“后”更好做有规律的。这是这种情况最常见的方法。
喜欢的东西
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
表是包含一个虚拟表在删除前立即记录。
另外请注意,触发运行作为delete语句隐含的交易的一部分,因此,如果您删除失败并回滚,触发也将回滚。
10
你也可以使用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
+8
在桌子上的INSTEAD OF DELETE,因为我有级联删除无法使用启用。 – user1374263
+2
FWIW,你可以改变所有的级联删除外键为普通外键和处理来自该触发器中的删除,这将使它在发生的事情作为删除的结果产生一个地方都清楚了。 – Tony
0
这是可以做到在下面的步骤进行,让我们在这个例子说,我使用的客户表:
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
相关问题
- 1. BEFORE DELETE触发器
- 2. 如何模拟SQL Server 2005中的BEFORE DELETE触发器
- 3. 在MYSQL中创建BEFORE INSERT触发器
- 4. 在SQL Server中创建触发器
- 5. SQL Server 2012.触发器。如何在创建表时自动创建触发器
- 6. 在SQL Server表上创建触发器
- 7. 如何在SQL中创建触发器?
- 8. 如何在sql中创建触发器
- 9. 如何在SQL Server 2005中更新触发器之前创建
- 10. 如何在SQL Server 2012中创建登录触发器
- 11. 如何在SQL Server中为每行创建触发器
- 12. SQL Server 2008 R2创建触发器
- 13. SQL Server创建审计触发器
- 14. 创建历史触发器SQL Server 2012
- 15. 在SQL Server在每次创建表创建触发器2008 R2
- 16. SQL Server 2008 - 如何使用DELETE触发器更新字段
- 17. 如何在SQL Server 2008上创建插入更新触发器
- 18. SQL Server:触发器触发
- 19. 触发器(AFTER/BEFORE)在Mysql
- 20. 如何为自动更新创建触发器与SQL Server 2008
- 21. 无论如何为“SELECT”语句创建SQL Server DDL触发器?
- 22. 如何创建这种SQL触发器?
- 23. 创建在SQL Server中比较日期的触发器
- 24. 在sql server 2008中创建一个触发器
- 25. 在SQL Server中创建审计触发器
- 26. 创建无法在SQL Server 2005中禁用的触发器
- 27. 在SQL Server Management Studio 2012中创建触发器
- 28. SQL服务器 - BEFORE INSERT触发
- 29. MySQL + delete触发器
- 30. 如何在SQL Server中创建从引用表中删除的触发器
感谢您的答复,它工作正常 – user1374263
注意到,对于回滚到上一个错误,一个try/catch块可在需要工作触发器[(示例)](http://dba.stackexchange.com/questions/57909)可能取决于导致错误的原因。 – crokusek
好点,但请记住,只适用于RAISEERROR。常规语句终止错误(例如,PK违例等)将导致隐式事务的回滚从触发器之外开始。 –