考虑一个场景。我在T1
操作上创建了触发器的INSERT
表。和存储过程如下。
//StoredProcedure.sql
BEGIN TRANSACTION;
...
...
INSERT INTO TABLE T1
/* Trigger will be executed on record insertion in Table T1 */
.....
.....
.....
.....
Consider some error here...
.....
.....
COMMIT TRANSACTION;
.....
.....
ROLLBACK TRANSACTION;
存储过程中的错误将调用ROLLBACK TRANSACTION
,是否会在触发器中执行ROLLBACK
操作?
MSSQL and MySQL
:考虑到理想情况,它由Trigger执行ROLLBACK
操作,但我希望您对该问题有所了解。
答案 0 :(得分:1)
为什么不简单地测试? 我花了不到10分钟在sql server上测试,包括创建表,触发器和存储过程。
对于sql server,答案是回滚也会回滚触发器操作。对于MySql,我会把测试留给你。
答案 1 :(得分:1)
是的,它肯定会回滚Trigger执行的操作。
我刚试过它。 :)
create table test (id int, testval varchar(20))
create table dummytest (dummyid int, dummytestval varchar(20))
CREATE TRIGGER trg_ins_test
ON test
FOR INSERT
AS
BEGIN
INSERT INTO dummytest
(dummyid,
dummytestval)
SELECT i.id,
i.testval
FROM inserted i
LEFT JOIN test t
ON i.id = t.id
AND i.testval = t.testval
END
CREATE PROCEDURE usp_test
AS
BEGIN
BEGIN try
BEGIN TRANSACTION
INSERT INTO test
VALUES (1,
'a')
SELECT 1 / 0
COMMIT
END try
BEGIN catch
IF @@TRANCOUNT > 0
ROLLBACK
END catch
END
您可以使用上面的代码进行测试。