我在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
(受影响的一行)
答案 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暴露于触发器,同时插入的结果集(对于更新后的更新行)和删除的结果集(对于更新的行,因为它们在更新之前)