我想制作一个触发器,但我不知道如何抓取导致触发的数据。
我有一张simlpe表。
FooId INT PK NOT NULL IDENTITY
Name VARCHAR(100) NOT NULL
我希望有一个触发器,以便在发生UPDATE,INSERT或DELETE时,我会执行以下操作。
IF INSERT
Print 'Insert' & Name
ELSE IF UPDATE
Print 'Update' & FooId & Name
ELSE IF DELETE
Print 'Delete' & FooId & Name
现在,我知道如何为表格触发。 我不知道该怎么做是根据触发类型确定值。
有人可以帮忙吗?
答案 0 :(得分:4)
伪表“inserted”包含新数据,“deleted”表包含旧数据。
您可以执行类似
的操作create trigger mytrigger on mytable for insert, update, delete
as
if ( select count(*) from inserted ) > 0
-- insert or update
select FooId, Name from inserted
else
-- delete
select FooId, Name from deleted
为了澄清其他人的所有评论,在插入时, inserted 表包含数据,而 deleted 为空。删除时,情况正好相反。在更新时,已删除和已插入包含任何已更新行的“之前”和“之后”副本。
答案 1 :(得分:1)
当您编写触发器时,您必须考虑到触发器可能被一次影响多行的语句调用的事实。
正如其他人所指出的,您引用插入表来获取更新或插入行的新值的值,并引用已删除的表以获取已删除<的值/ strong>行。
答案 2 :(得分:0)
SQL触发器提供一个名为“inserted”的隐式定义表,它返回受影响的行,允许您执行
之类的操作UPDATE mytable SET mytimestamp = GETDATE() WHERE id IN (SELECT id FROM inserted)
关于您的代码示例,如果您为每个代码执行单独的操作,则需要创建单独的INSERT,UPDATE和DELETE触发器。
(至少,在SQL Server中就是这种情况......你没有指定平台。)
答案 3 :(得分:0)
2008年,还有MERGE命令。你想怎么处理它?</ p>
从2008年开始,您可以使用以下四个命令修改表: INSERT,UPDATE,DELETE和MERGE:
http://blogs.conchango.com/davidportas/archive/2007/11/14/SQL-Server-2008-MERGE.aspx
http://sqlblogcasts.com/blogs/grumpyolddba/archive/2009/03/11/reasons-to-move-to-sql-2008-merge.aspx
当有人针对您的桌子发出MERGE命令时,您希望触发器做什么?