代码之家  ›  专栏  ›  技术社区  ›  Tom

如何在SQL Server触发器中测试多行操作?

  •  4
  • Tom  · 技术社区  · 17 年前

    5 回复  |  直到 17 年前
        1
  •  10
  •   Mitch Wheat    15 年前

    触发器定义应始终处理多行。

    取自 SQLTeam :

    -- BAD Trigger code following:
    
    CREATE TRIGGER trg_Table1 
    ON Table1 
    For UPDATE
    AS
    DECLARE @var1 int, @var2 varchar(50)
    
    SELECT @var1 = Table1_ID, @var2 = Column2
    FROM inserted
    
    UPDATE Table2
    SET SomeColumn = @var2
    WHERE Table1_ID = @var1
    

    以下是您应该如何实施它:

    CREATE TRIGGER trg_Table1 
    ON Table1 
    FOR UPDATE
    AS
    
    UPDATE t2
    SET SomeColumn = i.SomeColumn
    FROM Table2 t2
    INNER JOIN inserted i
    ON t2.Table1_ID = i.Table1_ID
    
        2
  •  4
  •   Cory House    14 年前

    是的,如果一条语句影响多行,则应该通过单个触发器调用来处理,因为您可能希望恢复整个事务。不可能在逻辑上将其拆分为单独的触发器调用,我认为SQLServer不提供这样的标志。通过发出影响多行的UPDATE或DELETE语句,可以使SQL Server使用多行调用触发器。

        3
  •  1
  •   HLGEM    17 年前

    首先,我关心的是,您正在使用游标使触发器处理多行。不要那样做!使用基于集合的语句,而不是连接到插入或删除的伪表。在我来这里工作之前,有人在我们的数据库里放了一个基于光标的触发器。处理一个400,00条记录的插入花费了40多分钟(我经常需要为一个客户机向这个表插入100000条记录)。将其更改为基于集合的解决方案将时间更改为不到一分钟。虽然所有触发器都必须能够处理多行,但不能通过创建性能噩梦来实现。

    如果可以为cusor编写select语句,则可以基于设置的相同select语句编写insert、update或delete语句。

        4
  •  0
  •   Steven Robbins    17 年前

        5
  •  0
  •   dkretz    17 年前

    一条SQL语句总是调用一个触发器执行——这是触发器定义的一部分。(这也是一种情况,似乎每个编写触发器的人至少都会被绊倒一次。)我相信您可以发现检查@@ROWCOUNT会影响多少记录。