我需要在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
中。
答案 0 :(得分:1)
首先,您需要update
,而不是insert
。
第二,SQL Server中的触发器每个语句触发一次,而不是每行触发一次。这意味着,如果触发触发器的update语句更新了多行,则触发器将被触发一次,并将有关这些行的数据包含在inserted
和deleted
表中。
第三,您需要确保触发器内的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'
的位置进行过滤,以仅更新那些行。