数据库11(触发器)
触发器有三种类型,包括删除触发器,更新触发器,添加触发器
触发器的作用是:当某个表发生某个操作时,自动触发触发器,进行触发器规定的操作
触发器语句
create trigger tname --创建触发器
on aa --创建在表上
for delete --创建在某个数据操作(增删改)上,insert/delete/update
as
begin
print ‘do delete’
end
delete aa
where title_id=‘PC9999’
加入该触发器后,对aa进行删除操作时会自动打印do delete语句
删除一行会触发一次,删除整表或多行也只触发一次,
即使没有符合删除条件的数据可以删除,该删除操作也会触发触发器
当操作可以满足多个触发器触发条件时,会有多个触发器同时被触发,进行相应操作
修改触发器:
alter trigger tname
……
修改触发器,只能在同一个表上,不可以修改表,如果表对象改变,需要新建一个触发器
触发器内部临时存储结构
触发器内部有临时存储结构,能够存储当前增删改操作的临时信息,是一个固定特殊临时的表,表名有deleted inserted,表示存储当前删除/增加/更新操作的临时信息
create trigger tname1
on aa
for delete
as
begin
declare @tempword varchar(50)
set @tempword=(select title from deleted)
print 'the deleted book is '+@tempword
print ‘do delete’
end
delete aa
where title_id=‘PC8888’
在触发器内部自定义变量,设置变量初始值为 被删除的对象的title列
打印返回结果,可以看到删除的title内容是什么
但是,自定义变量的方式只能由来进行单行数据的查询
如果同时对多个数据进行了删除操作,那么就不可以使用自定义变量
需要用到游标
practice
对jobs表的insert操作触发器进行修改,当输入的min_lvl>max_lvl时,两者互换,修正错误
alter trigger tname
on jobs
for insert
as
begin
declare @jobid int,@jobdcrp varchar(100),@min int,@max int
set @jobid=(select job_id from inserted)
set @jobdcrp=(select job_desc from inserted)
set @min=(select min_lvl from inserted)
set @max=(select max_lvl from inserted)
if @min>@max
begin
update jobs
set min_lvl=@max,set max_lvl=@min
where job_id=@jobid
print ‘I exchange it’
end
else
begin
print 'the inserted job_desc is ‘+cast(@jobid as varchar(10))+’ '+@jobdcrp
end
end
insert into jobs(job_desc,min_lvl,max_lvl)
values(‘new name’,50,15)
select * from jobs