(触发)如果cell1 ='value',则在表中插入(日期)值(CURRENT_TIMESTAMP)

时间:2018-11-19 18:55:57

标签: sql-server triggers database-trigger

我需要在SQL Server中创建一个触发器,该触发器在每次来自“ 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

我收到此错误消息

  

消息207,级别16,状态1,过程trg_FechaBaja,第3行[批处理开始第34行]
  无效的列名“状态”。

     IF status = 'Baja' THEN BEGIN

在这一行中,“状态”给我消息“无效的列名称'状态'”,我100%确信我的列具有该名称。

继续:得到一个名为table1的表,该表具有一个名为“ status”的列和另一个名为“ fechaBaja”的列

每次“状态”值更改为“巴哈”时,我都需要使用current_timestamp来触发和更新单元格“ fechaBaja”

所有操作都在同一table1中。

3 个答案:

答案 0 :(得分:1)

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

第二,SQL Server中的触发器每个语句触发一次,而不是每行触发一次。这意味着,如果触发触发器的update语句更新了多行,则触发器将被触发一次,并将有关这些行的数据包含在inserteddeleted表中。

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

您需要的代码如下:

 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

答案 1 :(得分:0)

我相信,如果更新的行状态字段等于“ Baja”,则您想更新fechaBaja字段。您还需要捕获主键信息。我输入了“ Id”,但您需要使用actuel字段名称进行更改。

 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

答案 2 :(得分:0)

您可以通过像这样连接三个表来实现

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是保留字,将其括在方括号中。
  • 将您的表与INSERTED表结合起来,以更新所有ID行的数据。
  • 将您的表与DELETED表结合在一起,以获取所有ID而不是'Baja'数据的地方。
  • INSERTED.[status] = 'Baja' AND DELETED.[status] <> 'Baja'的位置进行过滤,以仅更新那些行。