我正在尝试写一个
TRIGGER
,当满足某些条件时,事务必须回滚。目前我的脚本如下:
CREATE TRIGGER trg_AfterInsert_On_InvNum
ON InvNum
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Action AS CHAR(1);
SET @Action =
(CASE WHEN EXISTS(SELECT * FROM INSERTED)
AND EXISTS(SELECT * FROM INSERTED I
JOIN _evInvNumUDFLink UDF
ON I.AutoIndex = UDF.AutoIndex
WHERE I.DocType = 5 AND I.DocState = 1 AND I.DocVersion = 1 AND UDF.ubIDPOrdPriceChecked = 0 )
THEN 'I' -- Set Action to Updated.
ELSE NULL
END)
-- Check if the inserted row meets the specified conditions
BEGIN
IF @Action = 'I'
RAISERROR ('Your order has not been placed', 16, 1);
ROLLBACK TRANSACTION;
END
END;
GO
我需要检查的字段之一来自另一个表
_evInvNumUDFLink
,我必须将其加入到“INSERTED”表中。这不起作用,我想知道是否是因为JOIN
?
我还有很多东西要添加到这个触发器中,但我需要首先正确地解决这部分问题。
我对编写触发器还很陌生,也许我可以在这里得到一些指导?
小心使用触发器会发挥巨大作用。
不要在其中做太多事情,因为它们会降低该表的性能,并且在调试时很难跟踪错误的来源。
你想加入多少都可以,这与你的问题无关。
无论如何,从触发器进行回滚还没有完成,谁在该表上执行插入操作应该在 try...catch 中执行此操作,并在 catch 中处理错误并进行回滚。
您的触发器的一个例子可能是这样的
create trigger rtg_AfterInsert_On_InvNum on InvNum
after insert as
begin
set nocount on
select 1
from inserted i
inner join OIN _evInvNumUDFLink UDF on I.AutoIndex = UDF.AutoIndex
where I.DocType = 5
and I.DocState = 1
and I.DocVersion = 1
and UDF.ubIDPOrdPriceChecked = 0 )
if @@ROWCOUNT > 0
begin
THROW 51000, 'Your order has not been placed', 1
end
end