sql删除触发器不会回滚
如果SELECT中的语句存在,则触发器应该回滚。问题是,事实并非如此。当我仅从触发器运行SELECT时,它显示存在一行。但当我尝试使用与触发器中硬编码相同的值删除时,触发器会触发,但不会回滚。有人知道可能出了什么问题吗sql删除触发器不会回滚,sql,sql-server,triggers,rollback,Sql,Sql Server,Triggers,Rollback,如果SELECT中的语句存在,则触发器应该回滚。问题是,事实并非如此。当我仅从触发器运行SELECT时,它显示存在一行。但当我尝试使用与触发器中硬编码相同的值删除时,触发器会触发,但不会回滚。有人知道可能出了什么问题吗 CREATE TRIGGER trg_del ON Projektbefattningar FOR DELETE AS SELECT @befNr = Befattningsnr, @pNr = pNr, @EtappNr = Etappnr FROM deleted -
CREATE TRIGGER trg_del ON Projektbefattningar
FOR DELETE
AS
SELECT @befNr = Befattningsnr, @pNr = pNr, @EtappNr = Etappnr FROM deleted
-- Not currently using these. Using hard coded values to illustrate my problem
IF EXISTS (
SELECT *
FROM projektbefattningar
WHERE Befattningsnr = 2 AND pNr = 1 and Etappnr = 1 AND Anställningsnr is not null
)
BEGIN
RAISERROR('Could not delete, Anställningsnr is not null', 16, 1)
--THROW 50001, 'Could not delete, Anställningsnr is not null', 1;
ROLLBACK TRANSACTION;
END
GO
试试这个
CREATE TRIGGER trg_del ON Projektbefattningar
FOR DELETE
AS
SELECT @befNr = Befattningsnr
,@pNr = pNr
,@EtappNr = Etappnr
FROM deleted
-- Not currently using these. Using hard coded values to illustrate my problem
IF EXISTS (
SELECT 1
FROM deleted
WHERE Befattningsnr = 2
AND pNr = 1
AND Etappnr = 1
AND Anställningsnr IS NOT NULL
)
BEGIN
RAISERROR (
'Could not delete, Anställningsnr is not null'
,16
,1
)
--THROW 50001, 'Could not delete, Anställningsnr is not null', 1;
ROLLBACK TRANSACTION;
END
GO
当您使用DELATE时,您认为此触发器将在DELATE语句完成后启动。要在删除前验证条件,需要使用而不是删除。您的触发声明将是:
CREATE TRIGGER trg_del ON Projektbefattningar
INSTEAD OF DELETE
AS
现在要确认delete语句,您需要包括delete alghouth,因为它不会被删除。
最终程序如下所示:
CREATE TRIGGER trg_del ON Projektbefattningar
INSTEAD OF DELETE
AS
SELECT @befNr = Befattningsnr, @pNr = pNr, @EtappNr = Etappnr FROM deleted
-- Not currently using these. Using hard coded values to illustrate my problem
IF EXISTS (
SELECT *
FROM projektbefattningar
WHERE Befattningsnr = 2 AND pNr = 1 and Etappnr = 1 AND Anställningsnr is not null
)
BEGIN
RAISERROR('Could not delete, Anställningsnr is not null', 16, 1)
--THROW 50001, 'Could not delete, Anställningsnr is not null', 1;
ROLLBACK TRANSACTION;
END
ELSE
BEGIN
DELETE FROM YourTableToDelete Where idOfYourTable in ( Select idOfYourTable from Deleted )
END
GO
为什么不使用instead of触发器?为什么在回滚之前抛出异常?首先尝试回滚。看看这是否有帮助。这也是一个很好的解决问题的方法,我以前问这个问题时,触发器出现了问题,很好!谢谢另外,与DELETE相反,它不适用于外键,所以这不是很好。