在这个触发器中发生了什么?

时间:2011-05-05 12:27:44

标签: sql sql-server

我在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

在INSERT之前

(受影响的一行)

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

(受影响的一行)

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

(受影响的0行)

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

GO

在UPDATE之前

(受影响的一行)

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

(受影响的一行)

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

(受影响的一行)

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

删除前

(受影响的一行)

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

(受影响的一行)

3 个答案:

答案 0 :(得分:2)

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

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

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

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

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

(受影响的一行)

ID name salary start_date city region


     31 Rick              NULL                    NULL NULL       NULL

已删除的设置不包含任何内容(您在插入时不进行任何更改):

ID name salary start_date city region


(受影响的0行)

相同的更新逻辑:旧的行在已插入已删除更新。 对于删除:插入的设置为空,删除的设置是删除的行

答案 1 :(得分:1)

插入和删除的是触发使用的表,其中包含要插入和删除(duh!)的值到表中。

该示例向您显示插入时,值显示在inserted表中,删除表中的删除和两个表中的更新,因为更新被视为插入后跟删除。

答案 2 :(得分:0)

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