SQL 服务器 AFTER INSERT 触发器不工作,触发器如何工作?

SQL Server AFTER INSERT trigger not working, how does trigger work?

我在 table 上插入后写了一个触发器,table 上特定列中的数字 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

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

尝试这样的事情 - 这样触发器看起来也简单多了!

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