sql DELETE 触发器不会回滚
sql DELETE trigger won't rollback
如果 SELECT 中的语句存在,触发器应该回滚。事实是,事实并非如此。当我只从触发器中 运行 SELECT 时,它表明存在一行。但是,当我尝试使用与我在触发器中硬编码的值相同的值进行 DELETE 时,触发器会触发但不会回滚。任何人有任何想法可能是错的吗?
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
当您使用 FOR DELETE 时,您认为此 TRIGGER 将在删除语句完成后触发。要在删除之前验证条件,您需要使用 INSTEAD OF DELETE。您的触发器声明将是:
CREATE TRIGGER trg_del ON Projektbefattningar
INSTEAD OF DELETE
AS
现在要确认您的删除声明,您需要包括删除,尽管它不会被删除。
最后的程序是这样的:
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
如果 SELECT 中的语句存在,触发器应该回滚。事实是,事实并非如此。当我只从触发器中 运行 SELECT 时,它表明存在一行。但是,当我尝试使用与我在触发器中硬编码的值相同的值进行 DELETE 时,触发器会触发但不会回滚。任何人有任何想法可能是错的吗?
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
当您使用 FOR DELETE 时,您认为此 TRIGGER 将在删除语句完成后触发。要在删除之前验证条件,您需要使用 INSTEAD OF DELETE。您的触发器声明将是:
CREATE TRIGGER trg_del ON Projektbefattningar
INSTEAD OF DELETE
AS
现在要确认您的删除声明,您需要包括删除,尽管它不会被删除。 最后的程序是这样的:
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