【SQL Server】数据库——触发器

含义

是一种表或视图执行插入(insert)、 删除(delete)、修改(update)操作时,被系统自动执行的特殊的存储过程。

与存储过程的区别

  • 存储过程的执行通过调用过程名来完成;
  • 触发器的执行不能通过名称调用完成,而在某个指定的事件执行时被激活,如insert、update、delete数据时,会自动触发与该事件相关的触发器,使其自动执行;
  • 触发器不允许带参数。

创建触发器

格式
create   trigger   触发器名  on  表名| 视图名
for   |  after   |  instead   of   [ insert ,  update,  delete ] 
as   SQL语句

insert触发器

例:在学生库的成绩表上创建1个名为tr_insert_cj的触发器,当向成绩表进行插入操作时激发该触发器,并给出提示信息“有新成绩插入到成绩表中!”

create    trigger    tr_insert_cj   on   成绩      
after   insert
as    print   ‘有新成绩信息插入到成绩表! ’
go
insert   into   成绩   values(150102', ‘202', 99)

说明: 当插入的数据违反了先前定义的约束规则时,则约束优先于触发器起作用,该插入触发器不会被激发。

delete触发器

例:在学生库的成绩表上创建1个名为tr_delete_cj的触发器,当要删除指定学生选课成绩记录时,激发该触发器,撤消删除操作,并给出提示信息“不能删除该学生的选课成绩信息!”。

create   trigger   tr_delete_cj
on   成绩
after   delete
as
rollback  transaction-- 撤消删除操作
print  ‘不能删除该学生的选课成绩的信息!’
go
delete  成绩  where   学号=150101'

update触发器

例:在“学生”表上创建名为tr_update_xs的触发器,当对该表的“姓名”列修改时激发该触发器,使用户不能修改“姓名”列。

create   trigger   tr_update_xs   on   学生  
after   update
as
if   update(姓名)
begin
   rollback   transaction         -- 撤消修改操作
   print ‘不能修改学生姓名!’
end
go
update   学生   set   姓名=‘小红’  where   姓名=‘王红’ 

注意

(1)每个触发器被激活时,系统都为它自动创建两个临时表:inserted表、deleted表。inserted表、deleted表是逻辑表,由系统来维护,用户不能对它们进行修改。
其结构与源表 (触发器作用的表)结构相同,触发器执行完成后,该临时表会自动被删除。
(2)inserted临时表的作用:
当向表中插入数据时,如果该表存在insert触发器,触发器将被触发而自动执行。此时,系统将自动创建一个与触发器表具有相同表结构的inserted临时表,新的记录被添加到触发器表和inserted 表中。
(3)deleted 临时表的作用:
当从表中删除数据时,如果该表有delete触发器,触发器将被触发而自动执行。此时,系统将自动创建一个与触发器表具有相同表结构的deleted临时表,用来保存触发器中被删除的记录。
(4)当修改表中数据时, 相当于删除一条旧的记录,添加一条新的记录,其中被删除的记录放在deleted表中,同时添加的新记录放在inserted 表中。
例:在“课程”表上创建一个触发器。当更新了某门课程的课程编号信息时,就激活触发器级联更新“成绩”表中相关成绩记录中的课程编号信息,并使用print语句返回一个提示信息。

create   trigger   tr_update_kc   on   课程    
after   update
As
if update(课程编号)
 begin
    update 成绩
    set 成绩.课程编号=(select 课程编号 from inserted)
    where 成绩.课程编号=(select 课程编号 from deleted)
 end
go
update   课程   set  课程编号=555where   课程编号=212

更新触发器

alter   trigger    触发器名
……

删除触发器

drop   trigger    触发器名[,…n]

禁用触发器

Alter  table 表名 {enable | disable} trigger {all | 触发器名[,…n]}
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值