触发器

一:邹建
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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值