第七章(触发器)
触发器的概念:
触发器是一种实施复杂的,完整性约束的特殊存储过程,触发器定义在特定的表上,与表相关,自动触发执行,不能直接调用,是一个可回滚的事物。
触发器中两张特殊的表:
inserted表:存放insert或update语句执行所影响行的副本。
deleted表:存放deleted或update语句执行所影响行的副本。
注意:只读,不允许修改,触发器执行完后,自动删除。
触发器的分类:
根据触发器执行流程和触发事件先后的关系:after触发器和instead of触发器
根据触发器的命令语句划分:DML(数据操作语言)触发器,DDL(数据定义语言)触发器,DCL(数据控制语言)触发器
如何创建触发器:
CREATE TRIGGER trigger_name(触发器名称)
ON table_name
[WITH ENCRYPTION] (加密)
FOR [DELETE, INSERT, UPDATE](指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字)
AS(触发器要执行的操作)
T-SQL语句
GO
创建insert(插入)触发器: 当向表中插入数据时触发,自动执行触发器中定义的SQL语句
eg:、触发器: 新开一个手机账号,并在充值记录表中 保存日志说明为 ‘开户’
if OBJECT_ID('tr_phone_kaihu','trigger') is not null
drop trigger tr_phone_kaihu
go
create trigger tr_phone_kaihu
on phone
for insert
as
declare @phoneNo varchar(20)
begin
select @phoneNo=phoneNo from inserted
insert into phonelog values(@phoneNo,getdate(),'开户')
end;
go
declare @phoneNo varchar(20)
set @phoneNo='18875022258'
insert into phone values(@phoneNo,'林雪','012345678912345678',10)
delete(删除)触发器: 当删除表中记录时触发,自动执行触发器中定义的SQL语句
eg:触发器: 删除充值记录时,显示当前手机账户的真实姓名,和身份证号码
if OBJECT_ID('tr_phonelog_phoneNo','trigger') is not null
drop trigger tr_phonelog_phoneNo
go
create trigger tr_phonelog_phoneNo
on phonelog
for delete
as
declare @phoneNo varchar(20)
begin
select @phoneNo=phoneNo from deleted
select realName,idcard from phone where phoneNo=@phoneNo
end;
go
delete from phoneLog where phoneNo='18623490132'
update(修改)触发器: 当更新表中某列或多列时触发,自动执行触发器中定义的SQL语句
instead of触发器的使用:
创建instead of触发器的语法:
create trigger trigger_name
on table_name
instead of insert
as
sql语句
使用触发器的优点: