SQL触发多次插入更新

标签 sql sql-server t-sql triggers

我一直在研究如何创建一个处理多个更新/插入的 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

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

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

最佳答案

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 表。以上是更新触发器的示例,应该为您提供一些指导。

关于SQL触发多次插入更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40877305/

相关文章:

sql - 如何通过避免循环来优化此 t-sql 脚本代码?

php - 关闭控制台后重置所有登录用户

mysql - 当他们使用 php 登录时,尝试对每个帐户进行唯一查询

sql - 以一对多关系连接两个sql表,但想要第二个表的最大值

sql - 代码页的排序规则 (SQL Server)

sql - 用另一个表中的值替换表列中的值

sql - 返回不包含特定列的所有表的查询

c# - 在 CodeBehind C# SQL 中访问 SCOPE_IDENTITY()

t-sql - Sybase TSQL如何选择没有 `-`字符

sql-server - 自连接中引用的SQL Server CTE速度很慢