Trigger 触发器
本文非原创
一.触发器:
是一种特殊的存储过程,其特殊性在于它并不需要用户来执行、
调用,在表中数据进行修改时,自动执行,来实现复杂的完整性约束,
防止对数据不正确的修改。
1.定义:它是一段能够自动执行的程序,当对象进行 update,insert,
delete 时,自动执行,它没有参数,不允许被调用。
2.触发器的优点: (1)级联修改
(2)实现复杂约束
(3)检查数据
(4)控制修改表时合乎业务规则
二.触发器的激活时机:
1.后触发:当引起触发器执行的修改语句执行完成,并通过约束后才
执行触发器,这种触发叫后触发。
关键字:after / for 后触发只能创建在表上,
而不能创建在视图上。
2.替代触发:引起触发器执行的修改语句停止执行,仅执行触发器,
这种触发方式叫替代触发。
关键字:instead of 替代触发可以创建在表或视图上。
三.Inserted临时表和Deleted临时表:
每个触发器被执行时,系统都会为触发器创建两个系统临时表,
这两个临时表的结构与激活触发器的表的结构完全相同,触发器执行
完成后,这两个临时表都会被删除,可以用select语句来查询,
但不能对其修改。
inserted ----->插入操作(保存更新的数据)
deleted ----->删除操作(保存原来的数据)
语法:create trigger 拥有者.触发器名称 on [拥有者]
{表名称 / 视图名称}
for / after / instead of [insert,update,delete]
[with encryption]
as
SQL 语句
例: ----后触发:
(1)create trigger del_goods on goods
after delete
as
delete orders where 货品名称
in (select 货品名称 from deleted)
go
delete goods where 货品名称='jj'
if not exists(select * from orders where 货品名称='ff')
print '相关记录已从orders表中删除掉!'
(2)create trigger ins_orders on orders
after insert
as
declare @x char(20),@y bit
select @x=货品名称 from inserted ------>创建临时表
select @y=状态 from goods where 货品名称=@x
if @y=1
begin
print ('本货品正在整理中,现在不能下订单')
rollback transaction ------->回滚(将刚才执行的操作取消)
end
go
insert orders (货品名称,可湖编号,数量)values('ls',303,5)
select * from orders where 货品名称='d'
-----替代触发:
(1)create trigger ins_orders1 on orders
instead of insert
as
declare @x char(20),@y bit
select @x=货品名称 from goods where 货品名称=@x
select @y=状态 from goods where 货品名称=@x
if @y=1
begin
print('本货品正在整理中,现在不能下订单')
end
else
begin
insert orders(货品名称,可湖编号,数量)values (@x,@y)
end
go
insert orders(货品名称,可湖编号,数量)values ('ls',303,5)
select *from ordes where 货品名称='desk'
(2)create trigger YI_tri on YI
instead of insert
as
declare @zhi varchar(23),@shu int
select @zhi=book_addr,@shu=book_num from inserted
if @zhi='hgf'
begin
print 'haha'
end
else
begin
--insert YI(book_addr,book_num,book_name)values(@zhi,@shu,'LOVE')
print 'I Love You!'
end
go
insert YI(book_addr,book_num,book_name)values('sdfs',100,'str')
注意:不能在临时表或系统表上建立触发器,也不能在视图上建立后触发。
四.字段不被修改:
例:create trigger upd_orders on orders
after update
as
if update(定货日期)
begin
raiserror('123456789',16,1)
rollback transaction
end
五.重命名触发器:
语句:[execute] sp_rename 原触发器名称,触发器新名称
例:execute sp_rename ins_ordfers1,xinming
六.查看触发器:
(1)查看触发器的名称、类型、所有者和建立时间:
语句: [execute] sp_help 触发器名称
例: execute sp_help upd_orders
(2)查看一个表中触发器的类型:
语句: [execute] sp_helptrigger 触发器所属表的名称
例: execute sp_helptrigger orders
(3)查看一个未加密的触发器的定义:
语句: [execute] sp_helptext 触发器名称
例: execute sp_helptext xinming
(4)查看一个触发器的依赖关系:
语句: [execute] sp_depends 触发器名称
例: execute sp_depends del_goods
七.禁止触发器:
语句: alter table 表名
disable trigger 触发器名
例: alter table orders
disable trigger ins_orders
八.启用触发器:
语句: alter table 表名
enable trigger 触发器名
例: alter table orders
enable trigger ins_orders
九.删除触发器:
语句: drop trigger 触发器名 [……n]
例: drop trigger del_goods