【问题标题】:Need some help with Sql Server and a simple Trigger需要一些有关 Sql Server 和简单触发器的帮助
【发布时间】:2009-06-02 00:39:23
【问题描述】:

我希望创建一个触发器,但我不确定如何获取导致触发器的数据。

我有一张 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

现在,我知道如何为表格创建触发器了。 我不知道该怎么做是根据触发器类型找出值。

谁能帮忙?

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

【问题讨论】:

    标签: sql sql-server-2008 triggers


    【解决方案1】:

    伪表“插入”包含新数据,“删除”表包含旧数据。

    你可以这样做

    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
    

    为了澄清其他人制作的所有 cmets,在插入时,inserted 表包含数据,deleted 为空。在删除时,情况正好相反。在更新时,deletedinserted 包含任何更新行的“之前”和“之后”副本。

    【讨论】:

    • 如果操作是 INSERT,INSERTED 表是否包含标识值?
    • 会的。它将包含插入行中的所有数据,文本或二进制列除外。
    • 但是您没有在逻辑中考虑新的 MERGE 命令。
    • 所以,如果我做一个插入,那么插入的表有数据,删除没有。如果我进行更新,插入和删除的表都有数据吗?如果我做了删除,那么插入的表是空的,删除的表有数据?
    • 没错。想想“之前”和“之后”。在更新中,插入和删除的内容包含更新前后每一行的内容。在插入时,没有“之前”,该行不存在。删除时没有“之后”,该行现在消失了。
    【解决方案2】:

    在编写触发器时,您必须考虑到您的触发器可能会被一次影响不止一行的语句调用。

    正如其他人指出的那样,您引用 inserted 表来获取更新或插入行的新值的值,并引用已删除表来获取 deleted 行。

    【讨论】:

    • 啊!我错过了关于 INSERTED 表适用于 INSERT 和 UPDATE 触发器类型的评论。为澄清干杯。
    • 如果您正在寻找更新中的差异,您可以比较插入与删除
    • 不,我只是想知道表何时被(插入或更新)或(删除)。如果插入或更新,请执行 #1。否则做 #2 的事情。
    【解决方案3】:

    SQL 触发器提供了一个名为“inserted”的隐式定义表,该表返回受影响的行,允许您执行以下操作

    UPDATE mytable SET mytimestamp = GETDATE() WHERE id IN (SELECT id FROM inserted)
    

    关于您的代码示例,如果您为每个触发器执行单独的操作,您需要创建单独的 INSERT、UPDATE 和 DELETE 触发器。

    (至少,在 SQL Server 中是这种情况……您没有指定平台。)

    【讨论】:

    • 我不需要制作单独的触发器 .. 至少使用 MS Sql Server。对于单个触发器,您可以有 1、2 或 3 个 tryigger 类型。 MikeW 在他的回复中已经证明了这一点(在这个线程中)。
    【解决方案4】:

    在 2008 年,还有 MERGE 命令。你想怎么处理?

    从 2008 年开始,您可以使用以下四个命令修改表: 插入、更新、删除和合并:

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

    【讨论】:

    • ?????关于开篇文章中的示例代码,您能否详细说明如何使用它?
    • 不知道.. 我仍然需要弄清楚那个新命令是什么。 :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    相关资源
    最近更新 更多