【问题标题】:SQL trigger multiple insert updateSQL 触发多次插入更新
【发布时间】:2016-11-29 22:56:02
【问题描述】:

我一直在研究如何创建一个可以处理多个更新/插入的 TSQL 触发器。

我们有来自多个来源的数据,我的目标是在更新/插入之前验证/更正这些数据。

我编写了一个适用于单行数据的触发器。

我正在努力弄清楚如何让它处理多行数据。

CREATE TRIGGER [dbo].[tr_GPTitleToGov]
ON [dbo].[GoverningPersons]
AFTER INSERT, UPDATE
AS 
BEGIN
SET NOCOUNT ON;

DECLARE @Title1 VARCHAR(15)
DECLARE @UBI VARCHAR(9)
DECLARE @ETPID CHAR(4)
DECLARE @Ident INT

SET @Title1 = (SELECT Title1 FROM INSERTED)
SET @UBI = (SELECT UBI FROM INSERTED)
SET @ETPID = (SELECT [ETPID] FROM [entity] WHERE @UBI = [entity].[UBI])
SET @Ident = (SELECT Ident FROM INSERTED)

IF ((@Title1 = 'Executor') OR  (@Title1 = 'Incorporator'))
    BEGIN
        IF @ETPID IN ('0143', '0147', '0148', '0150', '0152', '0154')
        UPDATE GoverningPersons
        SET [Title1] = 'Executor',
            [Title2] = NULL,
            [Title3] = NULL,
            [Title4] = NULL
        WHERE Ident = @Ident;

        ELSE
        UPDATE GoverningPersons
        SET [Title1] = 'Incorporator',
            [Title2] = NULL,
            [Title3] = NULL,
            [Title4] = NULL
        WHERE Ident = @Ident;
    END
ELSE
    UPDATE GoverningPersons
    SET [Title1] = 'Governor',
        [Title2] = NULL,
        [Title3] = NULL,
        [Title4] = NULL
    WHERE Ident = @Ident;
END

我认为让我感到困惑的是在哪里加入字段,以便我可以根据不同表中的数据检查数据。

我以前从未编写过触发器,因此我们将不胜感激。

【问题讨论】:

    标签: sql sql-server tsql triggers


    【解决方案1】:
    CREATE TRIGGER [dbo].[tr_GPTitleToGov]
    ON [dbo].[GoverningPersons]
    AFTER UPDATE
    AS 
    BEGIN
    SET NOCOUNT ON;
    
    UPDATE gp
        SET Title1 = CASE
                 WHEN i.Title1 IN ('Incorporator','Executor')
                    AND e.ETPID IN ('0143', '0147', '0148', '0150', '0152', '0154') THEN 'Executor'
                 WHEN i.Title1 IN ('Incorporator','Executor') THEN 'Incorporator'
                 ELSE 'Governor'
              END
           ,Title2 = NULL
           ,Title3 = NULL
           ,Title4 = NULL
    FROM
        GoverningPersons gp
        INNER JOIN inserted i
        ON gp.Ident  = i.Ident
        LEFT JOIN entity e
        ON i.UBI = e.UBI
    
    
    END
    

    触发器每行执行一次,而是作为基于集合的操作,因此对于整个 DML 操作仅执行一次。因此,您需要像使用 join 语句的任何其他更新日期一样对待它。只有您可以使用特殊的 inserteddeleted 表。以上是更新触发器的示例,应该为您提供一些指导。

    【讨论】:

    • 谢谢,我现在就去看看!
    • 我不知道有case statement这样的东西。这太棒了!
    • @E.Powell A CASE expression 产生一个值。没有CASE 声明。遗憾的是,微软不理解这一点,并在其“文档”中随意使用术语。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多