需要一些Sql Server和一个简单的触发器的帮助

时间:2009-06-02 00:39:24

标签: sql sql-server-2008 triggers

我想制作一个触发器,但我不知道如何抓取导致触发的数据。

我有一张simlpe表。

FooId INT PK NOT NULL IDENTITY
Name VARCHAR(100) NOT NULL

我希望有一个触发器,以便在发生UPDATE,INSERT或DELETE时,我会执行以下操作。

Pseduocode

IF INSERT
    Print 'Insert' & Name
ELSE IF UPDATE
    Print 'Update' & FooId & Name
ELSE IF DELETE
    Print 'Delete' & FooId & Name

现在,我知道如何为表格触发。 我不知道该怎么做是根据触发类型确定值。

有人可以帮忙吗?

编辑:不确定它是否有帮助,但db是Sql Server 2008

4 个答案:

答案 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命令时,您希望触发器做什么?