【问题标题】:whats happening in this trigger?这个触发器发生了什么?
【发布时间】:2011-05-05 12:27:43
【问题描述】:

我正在学习 ms sql server 中的触发器,并在网站上遇到以下代码。我知道为插入、更新和删除命令创建了一个触发器,但不明白之后发生了什么。该网站也没有解释脚本。请解释一下这里发生了什么。

select * from employee

GO

ID          name       salary      start_date              city       region
----------- ---------- ----------- ----------------------- ---------- ------
      1     Jason      40420       1994-02-01 00:00:00.000 New York   W
      2     Robert     14420       1995-01-02 00:00:00.000 Vancouver  N
      3     Celia      24020       1996-12-03 00:00:00.000 Toronto    W
      4     Linda      40620       1997-11-04 00:00:00.000 New York   N
      5     David      80026       1998-10-05 00:00:00.000 Vancouver  W
      6     James      70060       1999-09-06 00:00:00.000 Toronto    N
      7     Alison     90620       2000-08-07 00:00:00.000 New York   W
      8     Chris      26020       2001-07-08 00:00:00.000 Vancouver  N
      9     Mary       60020       2002-06-09 00:00:00.000 Toronto    W

(受影响的 9 行)

-- Creating and Using Triggers

CREATE TRIGGER myTrigger
            ON employee
FOR UPDATE, INSERT, DELETE
AS
    SELECT * FROM inserted
    SELECT * FROM deleted

GO


SELECT 'Before INSERT'
INSERT Employee (ID, Name) VALUES (31, 'Rick')
GO

插入前

(受影响的 1 行)

ID          name       salary      start_date              city       region
----------- ---------- ----------- ----------------------- ---------- ------
         31 Rick              NULL                    NULL NULL       NULL

(受影响的 1 行)

ID          name       salary      start_date              city       region
----------- ---------- ----------- ----------------------- ---------- ------

(0 行受影响)

SELECT 'Before UPDATE'
UPDATE Employee
   SET Name = 'Rickie'
 WHERE ID = 3

GO

更新前

(受影响的 1 行)

ID          name       salary      start_date              city       region
----------- ---------- ----------- ----------------------- ---------- ------
          3 Rickie           24020 1996-12-03 00:00:00.000 Toronto    W

(受影响的 1 行)

ID          name       salary      start_date              city       region
----------- ---------- ----------- ----------------------- ---------- ------
          3 Celia            24020 1996-12-03 00:00:00.000 Toronto    W

(受影响的 1 行)

SELECT 'Before DELETE'
DELETE FROM Employee WHERE ID = 3
GO

删除前

(受影响的 1 行)

ID          name       salary      start_date              city       region
----------- ---------- ----------- ----------------------- ---------- ------

(0 行受影响)

ID          name       salary      start_date              city       region
----------- ---------- ----------- ----------------------- ---------- ------
          3 Rickie           24020 1996-12-03 00:00:00.000 Toronto    W

(受影响的 1 行)

【问题讨论】:

  • @martin....谢谢。我会记下@neil....你编辑了什么?
  • 编辑发生的时间是指向历史的链接,可让您查看执行的每个编辑的内容。但是在这种情况下(为了节省您的查看时间),Neil 使用代码块编辑了您的问题以格式化代码(和结果),这使您的问题更易于阅读。您以后可以通过突出显示代码(或其他应以固定宽度字体显示并保留间距的文本)并按下{} 按钮来自己执行此操作。
  • @damien...感谢您的信息:)

标签: sql sql-server


【解决方案1】:

触发器的基本概念是:EVENT->CONDITION->ACTION。

在事件(INSERT、UPDATE、DELETE)发生后,触发器会评估一个条件(在您的示例中没有条件,因此它始终为真)

当您使用触发器时,您可以访问两组数据:

-inserted(在操作期间插入的行,可能是插入、更新或删除) -deleted(在操作期间删除的行可能插入、更新、删除)

当您执行 INSERT inserted 集包含插入的行时:

(受影响的 1 行)

身份证姓名工资起始日期城市地区


     31 Rick              NULL                    NULL NULL       NULL

删除的集合不包含任何内容(您在插入中没有任何更改):

身份证姓名工资起始日期城市地区


(0 行受影响)

更新的逻辑相同:较旧的行在 deleted 中,较新的行在 inserted 中。 对于删除:插入集为空,删除集为删除行

【讨论】:

  • 这些插入和删除的表是否仅在触发器内部可用?它们包含所有插入或删除的数据还是最近的数据?
  • 它们仅在触发器内部可用,并且与引发触发器的操作相关,我们可以说它们与操作上下文相关。
【解决方案2】:

inserted 和 deleted 是触发器使用的表,其中包含正在插入和删除(duh!)到您的表中的值。

该示例向您展示了在插入时值出现在插入的表中,在删除时出现在已删除的表中以及在两个表中的更新时,因为更新被视为插入后删除。

【讨论】:

  • 别忘了提一下,这些表本质上是临时的,并且具有与基表相同的列结构。
  • 好的,像“SELECT 'Before INSERT”这样的语句中发生了什么?
  • 相当于打印语句,“SELECT FOO”会输出FOO。
  • 插入和删除的表是否仅在触发器内部可用?
  • @Rich Parker, @vatspoo - 不完全正确。它们也可以在 OUTPUT 子句中使用。
【解决方案3】:

其他答案已经提到插入表包含作为操作的一部分插入的行,而删除的表包含正在删除的行。不太直观的部分可能是,一个 UPDATE 暴露给触发器,其中包含插入的结果集(对于更新后的更新行)和删除的结果集(对于更新前的更新行) .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 2017-11-14
    相关资源
    最近更新 更多