首页 > 解决方案 > SQL Server AFTER INSERT 触发器不起作用,触发器如何工作?

问题描述

我在表上插入后写了一个触发器,表上的特定列中的数字 5,但是在我执行插入之后,没有任何反应。我想知道我的代码中有什么错误,因此插入后什么也没有发生

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[trigger_EstadoDoc]
ON [dbo].[EstadoDoc]
AFTER INSERT AS 
BEGIN 
    DECLARE @Puntaje1 INT; 
    DECLARE @Puntaje2 INT;

    SET @Puntaje1 = (SELECT 5 
                     FROM EstadoDoc, inserted
                     WHERE inserted.IdDoc = EstadoDoc.IdDoc 
                       AND inserted.Estado IN ('A','RyR') 
                       AND EstadoDoc.Estado = 'S')

    SET @Puntaje2 = (SELECT 10 
                     FROM EstadoDoc, inserted
                     WHERE inserted.IdDoc = EstadoDoc.IdDoc 
                       AND inserted.Estado IN ('A') 
                       AND EstadoDoc.Estado = 'RyR')

    IF @Puntaje1 != NULL
    BEGIN
        UPDATE EstadoDoc
        SET PuntajePrevio = @puntaje1 
        FROM EstadoDoc, inserted
        WHERE inserted.IdDoc = EstadoDoc.IdDoc 
          AND inserted.Secuencia = EstadoDoc.Secuencia
    END

    IF @Puntaje2 != NULL
    BEGIN
        UPDATE EstadoDoc
        SET PuntajePrevio = @puntaje2 
        FROM EstadoDoc, inserted
        WHERE inserted.IdDoc = EstadoDoc.IdDoc 
          AND inserted.Secuencia = EstadoDoc.Secuencia
    END

标签: triggerssql-server-2019

解决方案


查看我的所有评论 - 您基本上需要重写触发器以使用正确的基于集合的方法来处理多行插入,并且您需要养成使用正确的 ANSI/ISO JOIN语法(而不是弃用的逗号)的习惯FROM子句中的分隔表列表)。

试试这样的 - 触发器看起来也更简单!

CREATE OR ALTER TRIGGER [dbo].[trigger_EstadoDoc]
ON [dbo].[EstadoDoc]
AFTER INSERT AS 
BEGIN 
    SET NOCOUNT ON;

    -- as per charlieface's recommendation - check to see if any rows 
    -- have actually been inserted at all - if not, bow out
    IF (NOT EXISTS (SELECT * FROM Inserted))
         RETURN;

    UPDATE e
    SET PuntajePrevio = 5
    FROM dbo.EstadoDoc e
    INNER JOIN inserted i ON i.IdDoc = e.IdDoc 
                          AND i.Secuencia = e.Secuencia
    WHERE e.Estado = 'S'
      AND i.Estado IN ('A', 'RyR');
      
    UPDATE e
    SET PuntajePrevio = 10
    FROM dbo.EstadoDoc e
    INNER JOIN inserted i ON i.IdDoc = e.IdDoc 
                          AND i.Secuencia = e.Secuencia
    WHERE i.Estado = 'A'
      AND e.Estado = 'RyR';
END

推荐阅读