📄 触发器.txt
字号:
/*
在触发器执行的时候,会产生两个临时表:inserted表和deleted表。它们的结构和触发器所在的表的结构相同,
SQL Server2005自动创建和管理这些表。可以使用这两个临时驻留内存的表测试某些数据修改的效果及设置触发
操作的条件,但不能直接对表中的数据进行更改。
deleted表用于存储insert和updeate语句所影响的行的副本。在执行delete或update语句时,行从触发器表中删除,
并传输到deleted表中,deleted表和触发器表通常没有相同的行。
inserted表用于存储insert和update语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加
到inserted表和触发器表中。inserted表中的行是触发器表中新行的副本。
在对具有触发器的表进行操作时,其操作过程如下:
(1)执行insert 操作,插入到触发器表中的新行被插入到inserted表中;
(2)执行deleted操作,从触发器表中删除的行被插入到deleted表中;
(3)执行updated操作,先从触发器表中删除旧行,然后再插入新行。其中被删除的旧行被插入到deleted表中。
插入的新行被插入到inserted表中。
*/
例18
CREATE TRIGGER [insert1] ON [dbo].[teacher]
FOR INSERT, UPDATE
AS
DECLARE @njob char(10),@nsal numeric(9),@neno numeric(9)
SET @njob = (SELECT job FROM Inserted)
SET @nsal = (SELECT sal FROM Inserted)
set @neno=(select eno from inserted)
IF @njob = '教授' and @nsal <4000
begin
update teacher
set teacher.sal=4000
where eno=@neno
end
例19 /*建立日志文件Sal_log */
CREATE TABLE teacher
( Eno Char(4),
Username char(10),
Ssex char(3),
Job char(10),
Sal NUMERIC(7,2)
);
CREATE TABLE Sal_log
( Eno Char(4),
Sal NUMERIC(7,2),
Username char(10),
User_action char(14),
CDate datetime
);
注意在做例19时,要删除例18中建的触发器,否则会引起冲突。
/*当teacher表中的插入一条新记录时,自动在工资变化表中增加一条相应记录
CREATE TRIGGER [insert_sal] ON [dbo].[teacher]
FOR INSERT
AS
DECLARE @peno numeric(9), @psal numeric(9)
SET @peno = (SELECT eno FROM Inserted)
SET @psal = (SELECT sal FROM Inserted)
insert into sal_log values
(@peno, @psal, current_user,'insert',current_timestamp)
/*当teacher表中的工资发生变化后,自动在工资变化表中增加一条相应记录
CREATE TRIGGER [update_sal] ON [dbo].[teacher]
after update
AS
DECLARE @peno numeric(9), @psal numeric(9), @oldsal numeric(9)
SET @peno = (SELECT eno from inserted)
SET @psal = (SELECT sal from inserted )
set @oldsal =(SELECT sal from deleted )
if @psal <>@oldsal
begin
insert into sal_log values
(@peno, @oldsal, current_user,'before_update',current_timestamp)
insert into sal_log values
(@peno, @psal, current_user,'after_update',current_timestamp)
end
/*当teacher表中的删除一条记录时,自动在工资变化表中增加一条相应记录
CREATE TRIGGER [delete_sal] ON [dbo].[teacher]
FOR delete
AS
DECLARE @peno numeric(9), @psal numeric(9)
SET @peno = (SELECT eno FROM deleted)
SET @psal = (SELECT sal FROM deleted)
insert into sal_log values
(@peno, @psal, current_user,'delete',current_timestamp)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -