SQL Server 触发器与 JOIN

问题描述 投票:0回答:1

我正在尝试写一个

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

我还有很多东西要添加到这个触发器中,但我需要首先正确地解决这部分问题。

我对编写触发器还很陌生,也许我可以在这里得到一些指导?

sql-server triggers
1个回答
0
投票

小心使用触发器会发挥巨大作用。
不要在其中做太多事情,因为它们会降低该表的性能,并且在调试时很难跟踪错误的来源。

你想加入多少都可以,这与你的问题无关。

无论如何,从触发器进行回滚还没有完成,谁在该表上执行插入操作应该在 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
© www.soinside.com 2019 - 2024. All rights reserved.