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
我在 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