一种特殊的储存结构

通过事件触发,自动调用

分类:DDL触发器 create,alter,drop

      DML触发器 insert,update,delete

DML触发器:after触发器,insert,update,delete操作后触发

      instead of触发器:insert,update,delete操作后触发但不执行操作

          inserted插入表;deleted删除表

insert   插入后的数据    无

update   更新后的数据  更新前的数据 

delect  无                     删除后的数据

 

 

触发器是一个特殊的事务,可以设置一些条件,可以回滚

--创建触发器
create trigger trigger_test
on test
for update
as 
declare @id int,@name varchar(50),@age int--定义
select @id=id,@name=Tname,@age=age from deleted 
print '修改前:'+convert(varchar,@id)+','+@name+','+convert(varchar,@age);
select @id=id,@name=Tname,@age=age from inserted
print '修改后:'+convert(varchar,@id)+','+@name+','+convert(varchar,@age);
--没有备份表则创建备份表
--select * into testInfo
--from deleted
--把deleted表里的数据(只有刚刚执行的数据)插入备份表
--insert into testInfo(Tname,age,datetime)select Tname,age,datetime from deleted
delete from test where id=11

--先进行更改操作,触发触发器,触发器进行,把更改前的数据存入deleted,更改后的数据存入inserted
--deleted,inserted,这两个表都是虚拟表,只读,当触发器结束后就这两个表就注销了,最后执行原本的更改操作。
update test set Tname='jhi',age=2
where id=9

 

alter trigger delete_test
on test
for delete
as
declare @id int,@name varchar(50),@age int
select @id=id,@name=Tname,@age=age from deleted
print('删除:')+convert(varchar,@id)+','+@name+','+convert(varchar,@age)
if(object_id('testBackup','U')is not null)--‘U’对象类型是表
insert into testBackup select 
Tname,age,datetime from deleted--标识列不能显式插入标识列,所以这里不能插入id
else
select id,Tname,age,datetime into testBackup from deleted
print'备份成功!'

delete from test where id=23

 

posted on 2023-04-19 17:25  阿霖找BUG  阅读(11)  评论(0编辑  收藏  举报