SQLServer第十章:触发器 trigger

触发器:一种特殊的存储过程,特殊在它不能手动进行调用,只能通过操作自动去触发
    完成一些复杂的约束(是普通约束做不到的)

操作类型分类:
  insert触发器:由insert插入操作来触发
  update触发器:由update修改操作来触发
  delete触发器:由delete删除操作来触发

触发时间分类:
  for(after):先执行sql语句,然后再执行触发器
  instead of:替代触发器,先执行触发器

临时表:只能触发器里面用
---------------------------------------------------------------------------------------------------------------
  insert操作    delete操作          修改操作
---------------------------------------------------------------------------------------------------------------
  inserted    存放插入的数据     修改后的数据
---------------------------------------------------------------------------------------------------------------
  deleted    存放删除的数据      修改前的数据
---------------------------------------------------------------------------------------------------------------  

创建两个表做演示:

--表1
if exists(select * from sys.objects where name='b1')
begin
    drop table b1
end
go
create table b1
(
    name varchar(20) not null,
    pwd varchar(20) not null
)
--表2
if exists(select * from sys.objects where name='b2')
begin
    drop table b2
end
go
create table b2   
(
    Id int primary key identity(1,1),
    username varchar(20),
)

select * from b1
select * from b2

执行原理:选中insert语句,点击执行,把sql语句执行后,才会执行触发器

if exists(select * from sys.objects where name='trigger_insertrecordinfo')
begin
    drop trigger trigger_insertrecordinfo --删除触发器
end
go
create trigger trigger_insertrecordinfo   --创建触发器
on b2            
for insert
as
    update b1 set name='张三' where name=
        (
            select username from b2 where username='admin'
        )
go
insert into b1 values('admin','123456')
insert into b2 values('admin1')
select * from b1
select * from b2

示例二,创建触发器,实现自动备份的效果(对b2表进行删除后,将删除后的数据自动备份到新表中(只备份最新的一次))

if exists(select * from sys.objects where name='trigger_delrecordinfo')
begin
    drop trigger trigger_delrecordinfo
end
go
create trigger trigger_delrecordinfo
on b2
for delete
as
    if exists(select * from sys.objects where name='newtable')
    begin
        drop table newtable
    end
    select *  into newtable from deleted   --将删除后的数据 备份到表newtable里面
go
--用delete from 来删除b2数据,不会删除表,数据会自动备份给新表newtable
delete from b2  
select * from newtable  --备份了b2的数据,显示出来
select * from b2        --显示b2没有数据了

示例三:创建触发器,实现换机功能(修改上机记录时,自动修改计算机状态)

if exists(select * from sys.objects where name='trigger_updaterecordinfo')
begin
    drop trigger trigger_updaterecordinfo
end
go
create trigger trigger_updaterecordinfo
on b2
for update
as
    --对调两台计算机的状态
    declare @oldpcid varchar(20),@newpcid varchar(20)
    
    select @newpcid=username from inserted --修改后的
    select @oldpcid=username  from deleted--修改前的
    
    update b1 set name='以上机' where pwd=@newpcid
    update b1 set name='未上线' where pwd=@oldpcid
go
update b2 set username='123456'  where Id=2 and username is not null

select * from b1
select * from b2

示例四:创建触发器,实现级联删除的功能

if exists(select * from sys.objects where name='trigger_delstu')
begin
    drop trigger trigger_delstu
end
go
create trigger trigger_delstu
on b2
instead of delete
as
    declare @stuno varchar(20)
    select @stuno=username from deleted
    
    --判断:丛表有引用就删除丛表
    if exists(select * from b1 where pwd=@stuno)
    begin
          delete from b1 where pwd=@stuno
    end
    --删除主表
    delete from b2 where username=@stuno
go
delete from b2 where username='123456'

select * from b1
select * from b2

 

posted @ 2022-10-04 00:21  Akai_啊凯  阅读(175)  评论(0编辑  收藏  举报