本文纯属个人见解,是对前面学习的总结,如有描述不正确的地方还请高手指正~
一、触发器概述
1、SQL Server供提两种类型的触发器:AFTER触发器和INSTEADOF触发器。
l AFTER触发器作用在表上,晚于约束处置。对于AFTER触发器,如果一个表同时拥有约束和触发器,在行进据数作操时,首先行进约束查检,查检功成后再活激触发器。如果查检失败将中断据数作操,并且法无活激触发器。
l INSTEAD OF触发器作用在表或视图上,早于约束处置。INSTEAD OF触发器将替换据数作操语言,执行INSTEAD OF触发器中的码代。
2、触发器可以拜访两种动态生成的殊特表:inserted表、deleted表。
二、创立触发器
1、语法
(1)DML
CREATETRIGGER 触发器名 ON 表或视图名
[WITHENCRYPTION]
For|AFTER|INSTEADOF [[INSERT],[UPDATE],[DELETE]]
AS
(主体部份)
(2)DDL
CREATETRIGGER 触发器名
ON ALLSERVER | DATABASE
For|AFTER
(事件)
AS
(主体部份)
附注:
事件:CREATE_TABLE、ALTER_TABLE、DROP_TABLE....
2、例实
(1)DML
①计设一个单简的AFTER INSERT触发器,这个触发器的作用是:在插入一条录记的时候,收回“又添加了一个先生的成就”的好友提示。
create triggerscore_insert
on 成就表
after insert
as
begin
print '又添加了一个先生的成就'
end
②在成就表上创立一个instead of insert触发器,实现:当向表成就表插入录记时查检分数的合理性,如果不合理就不行进插入作操,否则答应。
create triggerscore_insert_instead
on 成就表
instead of insert
as
begin
set nocounton
declare @scoreint
select @score=成就frominserted
if(@score<0or @score>100)
print '分数不合理'
else
insert into 成就表(学号,课程编号,成就)
select 学号,课程编号,成就frominserted
end
③给score表创立一个after insert触发器,实现:当向成就表插入录记时,提示‘向成就表插入了内容为:…的录记’,也就是把插入表中的录记息信示显出来。
CREATE TRIGGER示显_Insert
ON 成就表
AFTER INSERT
AS
BEGIN
declare
@编号int,
@学号varchar(14),
@课程编号int,
@成就int
select @编号=编号,@学号=学号,@课程编号=课程编号,@成就=成就from inserted
print '插入的录记为:'+CAST(@编号AS varchar(16))+','+@学号+','+CAST(@课程编号AS varchar(16))+','+CAST(@成就AS varchar(6))
END
④创立一个触发器‘删除课程表录记_tri’:实现当删除课程表中某门课程的录记时,对应于选课表中相干该课程的有所录记也均删除。
create trigger删除课程表录记_tri on 课程表
for delete
as
delete 选课表from 选课表,deleted
where 选课表.课程号=deleted.课程号
⑤创立一个触发器‘课授表录记作操_tri’:当向课授表中插入新记录时查检该记录的职工号在教师表中是不是存在,同时查检课程号在课程表中是不是存在,如有一项不满足件条,则返回错误息信
create trigger课授表录记作操_tri on 课授表
for update
as
begin
declare @职工号 varchar(10),@课程号varchar(10)
if exists(select* from 课授表 where @职工号=职工号)
begin
if exists(select *from 课程号 where @课程号=课程号)
insert into 课授表(职工号,课程号)
values(@职工号,@课程号)
else
print '课程号不存在'
end
else
print '该记录的职工号不存在'
end
⑥创立触发器‘修改先生表1据数_tri’:实现当修改先生表1的录记时,返回提示息信‘先生表1的据数被修改!!’。
create trigger修改先生表据数_tri on 先生表
for update
as
begin
print '先生表的据数被修改!!'
end
(2)DDL
①建立一个DDL触发器,于用护保据数库中的据数表不被修改,不被删除。
create trigger制止对据数表作操
on database
for ALTER_TABLE,DROP_TABLE
as
begin
PRINT '对不起,您不能对据数表行进作操'
ROLLBACK
end
②建立一个DDL触发器,于用护保前当SQL Server服务器里有所据数库不能被删除。
CREATE TRIGGER不答应删除据数库
ON allserver
FOR DROP_DATABASE
AS
begin
PRINT '对不起,您不能删除据数库'
ROLLBACK
end
三、修改触发器
1、语法
ALTER TRIGGER 触发器名 ON 表或视图名
[WITHENCRYPTION]
For|AFTER|INSTEADOF [[INSERT],[UPDATE],[DELETE]]
AS
(主体部份)
2、例实
①修改‘修改先生表1据数_tri’,添加insert激起件条
alter trigger修改先生表据数_tri on 先生表
for update,insert
as
begin
print '先生表的据数被修改!!'
end
四、删除触发器
1、语法
DROPTRIGGER [schema_name.]trigger_name [ ,...n ] [ ; ]
DROPTRIGGER trigger_name [ ,...n ] ON { DATABASE | ALL SERVER }
2、例实
①删除‘修改先生表据数_tri’
drop trigger 修改先生表据数_tri
文章结束给大家分享下程序员的一些笑话语录:
看新闻说中国输入法全球第一!领先了又如何?西方文字根本不需要输入法。一点可比性都没有。