SQL Server 触发器

8

我有这样的一个表结构:

create table status_master
(
  Name varchar(40)
  status varchar(10)
)

我需要为状态列创建触发器,如果状态列的值更新为FAIL,则触发器会调用一个插入命令,如下所示:

insert into temp value('s',s's')

请问有人能给我解决这个问题的思路吗?


3
能否说明一下?我不明白您真正想要实现什么... - marc_s
一个语法错误,就像你的例子一样,永远不会到达触发器。 - Dave
同意marc_s的观点。"更新值"指的是什么?状态?表格"temp"的结构是怎样的?你放进去的那些's'值是什么? - Aaron Bertrand
4个回答

10

不确定你真正想要实现什么目标 - 但在SQL Server中,你有两种类型的触发器:

  • AFTER 触发器在 INSERT、UPDATE、DELETE 后触发。
  • INSTEAD OF 触发器可以捕获操作(INSERT、UPDATE、DELETE)并代替执行。

SQL Server没有其他RDBMS拥有的 BEFORE INSERT/UPDATE/DELETE 触发器。

你可以拥有任意数量的 AFTER 触发器,但每个操作(INSERT、UPDATE、DELETE)只能拥有一个 INSTEAD OF 触发器。

更常见的情况是 AFTER 触发器,例如:

CREATE TRIGGER trgCheckInsertedValues
ON status_master
AFTER INSERT
AS
BEGIN
  INSERT INTO dbo.temp(field1, field2, field3)
     SELECT i.Name, i.Status
     FROM inserted i
     WHERE i.Status = 'FAIL'
END

在这里,我正在检查“inserted”伪表,该表包含插入到您的表中的所有行,并且对于每一行中包含“status = FAIL”的行,您将向“temp”表插入一些字段。

再次强调 - 不确定您需要什么具体内容 - 但这是使用 SQL Server T-SQL 代码实现的大致轮廓。

Marc


3

0
你需要的是一个INSTEAD OF INSERT, UPDATE触发器。在触发器内部,你可以尝试自己进行插入或更新操作,并使用try-catch语句来捕获错误。如果出现错误,则将这些值插入到另一个表中(假设它是某种日志记录表)。

0

假设你的意思是,状态的新值是FAIL,那么这样怎样:

触发器使用“inserted”引用新记录行,使用“deleted”引用旧记录行

CREATE TRIGGER trgCheckInsertedValues ON status_master AFTER INSERT AS

BEGIN

如果插入的status为“FAIL”,则插入到dbo.temp(field1,field2,field3)
SELECT i.Name,i.Status,“anything” FROM inserted i


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接