(TRIGGER) if cell1 = 'value' THEN INSERT INTO table (date) 值 (CURRENT_TIMESTAMP)

(TRIGGER) if cell1 = 'value' THEN INSERT INTO table (date) VALUES (CURRENT_TIMESTAMP)

我需要在 SQL 服务器中创建一个触发器,每次当 "status" 列的值 = 'Baja'

时触发
CREATE TRIGGER trg_triggerName 
ON dbo.table1 
AFTER UPDATE 
AS
BEGIN
    IF status = 'Baja' THEN BEGIN
        INSERT INTO dbo.table1 (fechaBaja)  
        VALUES (CURRENT_TIMESTAMP) 
    END
END
GO

我收到这条错误消息

Msg 207, Level 16, State 1, Procedure trg_FechaBaja, Line 3 [Batch Start Line 34]
Invalid column name 'status'.

     IF status = 'Baja' THEN BEGIN

在这一行中,"status" 给我消息 "invalid column name 'status'",我 100% 确定我的专栏有那个名字。

在简历中:得到了一个名为 table1 的 table,它有一个名为 'status' 的列和另一个名为 'fechaBaja'

的列

每次 'status' 值更改为 'Baja' 时,我需要使用 current_timestamp

触发并更新单元格 'fechaBaja'

所有操作都在同一个table1.

我相信如果更新的行状态字段等于“Baja”,您想要更新 fechaBaja 字段。您还需要捕获主键信息。我放了 'Id' 但你需要用你的实际字段名称来改变它。

 CREATE TRIGGER trg_triggerName ON dbo.table1 
 AFTER UPDATE AS
 BEGIN

        UPDATE dbo.table1 SET fechaBaja=CURRENT_TIMESTAMP 
        WHERE EXISTS (SELECT 1 FROM INSERTED I WHERE dbo.table1.Id = I.Id AND I.Status='Baja')

 END
 GO

你可以通过像

这样的三个 table 加入来做到这一点
CREATE TRIGGER trg_triggerName ON dbo.table1 AFTER UPDATE AS
 BEGIN
     UPDATE T1
     SET T1.fechaBaja = CURRENT_TIMESTAMP
     FROM dbo.table1 T1 INNER JOIN INSERTED T2 ON T1.ID = T2.ID
                        INNER JOIN DELETED  T3 ON T1.ID = T3.ID
     WHERE T2.[status] = 'Baja'
           AND
           (T3.[status] <> 'Baja' OR T3.[status] IS NULL);
 END
 GO
  • 不需要使用IF
  • status为保留字,用括号括起来。
  • 将您的 table 与 INSERTED table 合并以更新所有 ID 行。
  • 将您的 table 与 DELETED table 合并以获得数据不是 'Baja'.
  • 的所有 ID
  • 过滤 INSERTED.[status] = 'Baja' AND DELETED.[status] <> 'Baja' 以仅更新那些行。

首先,您想要 update,而不是 insert

其次,SQL 服务器中的触发器每条语句触发一次,而不是每行一次。这意味着如果触发触发器的更新语句更新了多行,您的触发器将被触发一次,并将有关这些行的数据包含在 inserteddeleted 表中。

第三,您需要确保触发器内部的更新语句不会再次引发它。通过配置数据库来做到这一点。

您需要的代码是这样的:

 CREATE TRIGGER trg_triggerName ON dbo.table1 
     AFTER UPDATE AS
 BEGIN

     UPDATE t
     SET fechaBaja = CURRENT_TIMESTAMP
     FROM dbo.table1 As T
     INNER JOIN Inserted As I
         ON T.<PrimaryKey> = I.<PrimaryKey>
     INNER JOIN Deleted As D
         ON T.<PrimaryKey> = D.<PrimaryKey>
     WHERE I.[status] = 'Baja'
     AND (D.[Status] IS NULL OR D.[Status] <> 'Baja')

 END
 GO