一:邹建
1.触发器的内容和存储过程一样,都是将一些数据处理命令放在一齐执行
不同的是:存储过程中调用它时才执行,触发器在对表中的数据进行操作时被自动调用
2.在何时(那种操作时)会执行触发器
这个由for语句决定.
for insert 代表插入数据时
for update 代表更新数据时
for delete 代表删除数据时
insert update delete可以组合.例如:for insert,update 表示新增或更新数据时
3.得到操作影响的数据,由inserted和deleted这两个逻辑表得到,结果与原表完全一样
inserted 新增的数据,或更新操作时,更新后的数据
deleted 删除的数据,或更新操作时,更新前的数据
更多的参考联机帮助.
举个简单的例子:
--创建表
create table tb(id int,name varchar(20))
--为这个表创建触发器,作用是检查新增数据时,名称是否重复,如果重复,取消插入:
create trigger t_chk on tb
for insert
as
if exists(select 1 from tb where name in(select name from inserted))
rollback tran
go
--插入数据
insert into tb values(1,'张三') --可以插入成功
insert into tb values(2,'张三') --因为名称重复,插入会被触发器取消
--显示结果
select * from tb
二:大力
a :
create table 表 (a int)
go
insert 表 values (1)
go
CREATE TRIGGER 名 ON 表
FOR UPDATE
AS
select a 更新前被删除的数据 from deleted
select a 更新后被插入的数据 from inserted
go
------------测试:
update 表 set a=3
b:
create table 表 (a int,b int)
go
insert 表 values (1,2)
go
CREATE TRIGGER 名 ON 表
FOR UPDATE
AS
if update(a)
begin
select a 更新前a被删除的数据 from deleted
select a 更新后a被插入的数据 from inserted
end
if update(b)
begin
select a 更新前b被删除的数据 from deleted
select a 更新后b被插入的数据 from inserted
end
go
------------测试:
update 表 set a=3
-----------------
update 表 set b=4
c:
下面同步两个不同数据库的两个表:
CREATE TRIGGER 名1 ON dbo.tabMain
FOR INSERT
AS
insert db2..tabSlave select * from inserted
go
CREATE TRIGGER 名2 ON dbo.tabMain
FOR update
AS
update db2..tabSlave set 列=aa.列 from inserted aa where aa.编号=db2..tabSlave.编号
go
CREATE TRIGGER 名3 ON dbo.tabMain
FOR delete
AS
delete db2..tabSlave where 编号 in (select 编号 from deleted)
go
三: happydreamer()
稍微补充一点
触发器影响会@@IDENTITY 的值
example
我想编个触发器,其功能如下:
当我往一个表里插入记录后,触发器立刻将新记录的一个字段sj(时间类型,我叫它为sj)与上一记录的sj求出其时间差并将上一记录的long值修改为该差值。
表的结构如下:
waste1
--------------------------------------
id int 4
sj datetime 8
long int 8
--------------------------------------
比如现在有记录如下:
id sj long
1 2002-12-12 12:00 0
假如我插入一条记录
2 2002-12-12 13:00
则触发器就将第二条记录的sj-第一条记录的sj,然后起差值作为第一条记录的 long值.
最总记录如下:
id sj long
1 2002-12-12 12:00 1
2 2002-12-12 13:00 0
error answer
create trigger a_t on table
for insert
as
update table
set long=datediff(hh,b.sj,a.sj)
from
inserted a ,
(select * from table where id=@@identity-1) b
where aaa.id=b.id
“where id=@@identity-1”是不允许的,那是 3GL。
insert一组数据时,系统就会出错,怎么当作合格的产品?
“系统就会出错”---> “系统计算的数据就会混乱”
--right answer
create trigger a_t on aaa
for insert
as
update table
set long=datediff(hh,b.sj,a.sj)
from
inserted a ,
table b
where b.id=a.id-1