sqlserver的触发器练习实例

触发器的概念:它是由事件驱动的,就像java中的监听,当某个事件发生了,就会做一些工作。

下面直接上干货,创建insert触发器、delete触发器、DDL触发器和如何查看触发器定义

1.创建三个表学生表、班级表、课程表

create database student_score
GO
--在数据库中创建三个表学生表、班级表、课程表的结构
use student_score
GO
create table student
( stu_id char(8) primary key,
  stu_name char(10),
  stu_sex char(2),
  stu_birthday smalldatetime,
  class_id char(6)
)
go
create table class
(  class_id char(6) primary key,
  class_name varchar(30),
class_num int,
)
create table course
( course_id char(3) primary key,
  course_name varchar(30),
)
go
create table score
( stu_id char(8),
  course_id char(3),
  score int check(score>=0 and score<=100)
  primary key(stu_id,course_id)
)
go

 2.插入用例数据

--往表中插入数据(student,course,score)
 insert into student values('0601001','李玉','女','1987-05-06', '0601')
 insert into student values('0601002','鲁敏','女','1988-06-28', '0601')
 insert into student values('0601003','李小路','女','1987-01-08', '0601')
 insert into student values('0601004','鲁斌','男','1988-04-21', '0601')
 insert into student values('0601005','王宁静','女','1986-05-29', '0601')
 insert into student values('0601006','张明明','男','1987-02-24', '0601')
 insert into student values('0601007','刘晓玲','女','1988-12-21', '0601')
 insert into student values('0601008','周晓','男','1986-04-27', '0601')
 insert into student values('0601009','易国梁','男','1985-11-26', '0601')
 insert into student values('0601010','季风','男','1986-09-21', '0601')
  
insert into class values('0501','计算机办公应用', 40)
insert into class values('0502','网络构建', 43)
insert into class values('0503','图形图像', 48)
insert into class values('0601','可视化', 41)
insert into class values('0602','数据库', 38)
insert into class values('0603','网络管理', 45)
insert into class values('0604','多媒体', 40)
insert into class values('0701','计算机办公应用', 39)
insert into class values('0702','WEB应用', 38)
insert into class values('0703','网络构建', 40)
 
insert into course values('001','计算机应用基础')
insert into course values('002','关系数据基础')
insert into course values('003','程序设计基础')
insert into course values('004','数据结构')
insert into course values('005','网页设计')
insert into course values('006','网站设计')
insert into course values('007','SQL Server 2000关系数据库')
insert into course values('008','SQL Server 2000程序设计')
insert into course values('009','计算机网络')
insert into course values('010','Windows Server 配置')
 
insert into score values('0601001','001',78)
insert into score values('0601002','001',88)
insert into score values('0601003','001',65)
insert into score values('0601004','001',76)
insert into score values('0601005','001',56)
insert into score values('0601006','001',87)
insert into score values('0601007','001',67)
insert into score values('0601008','001',95)
insert into score values('0601009','001',98)
insert into score values('0601010','001',45)
 
insert into score values('0601001','002',48)
insert into score values('0601002','002',68)
insert into score values('0601003','002',95)
insert into score values('0601004','002',86)
insert into score values('0601005','002',76)
insert into score values('0601006','002',57)
insert into score values('0601007','002',77)
insert into score values('0601008','002',85)
insert into score values('0601009','002',98)
insert into score values('0601010','002',75)
 
insert into score values('0601001','003',88)
insert into score values('0601002','003',78)
insert into score values('0601003','003',65)
insert into score values('0601004','003',56)
insert into score values('0601005','003',96)
insert into score values('0601006','003',87)
insert into score values('0601007','003',77)
insert into score values('0601008','003',65)
insert into score values('0601009','003',98)
insert into score values('0601010','003',75)
 
insert into score values('0601001','004',74)
insert into score values('0601002','004',68)
insert into score values('0601003','004',95)
insert into score values('0601004','004',86)
insert into score values('0601005','004',76)
insert into score values('0601006','004',67)
insert into score values('0601007','004',77)
insert into score values('0601008','004',85)
insert into score values('0601009','004',98)
insert into score values('0601010','004',75)
 
insert into score values('0601001','005',74)
insert into score values('0601002','005',68)
insert into score values('0601005','005',76)
insert into score values('0601008','005',85)
insert into score values('0601009','005',98)
insert into score values('0601010','005',75)
 
insert into score values('0601002','006',88)
insert into score values('0601003','006',95)
insert into score values('0601006','006',77)
insert into score values('0601008','006',85)
insert into score values('0601010','006',55)
 
insert into score values('0601001','007',84)
insert into score values('0601002','007',68)
insert into score values('0601003','007',95)
 
insert into score values('0601004','008',86)
insert into score values('0601005','008',76)
insert into score values('0601006','008',67)
 
insert into score values('0601007','009',67)
insert into score values('0601008','009',85)
 
insert into score values('0601009','010',98)
insert into score values('0601010','010',75)

3.练习实例

--1)在student上创建<strong>INSERT触发器</strong>stu_insert,要求在student表中插入记录时(要求每次只能插入一条记录),这个触发器都将更新class表中的class_nun列。并测试触发器stu_insert。
create trigger stu_insert
on student
for insert
as
update class set class_num=class_num + 1
where class_id=(select class_id from inserted)
 
--测试
insert into student values('0602011','文','女','1986-09-21', '0602')
 
 
--2)在student上创建<strong>DELETE触发器</strong>stu_delete,要求在student表中删除记录时,这个触发器都将更新class表中的class_nun列。并测试触发器stu_delete。
create trigger stu_delete
on student
for delete 
as
update class set class_num=class_num - 1
where class_id = (select class_id from deleted)
 
--测试
delete from student where stu_id='0601001'
 
--3)查看触发器相关信息:使用系统存储过程<strong>sp_help,sp_helptext查看触发器</strong>相关信息。
exec sp_help
exec sp_help stu_insert
exec sp_helptext stu_insert
 
--4)对于下列触发器:
create trigger stu_update
on student
instead of update
as
print '修改学生表'
drop trigger stu_update
执行语句
update student
set stu_id='0601003'
where stu_name='鲁斌'
会怎么样?
--消息 2627,级别 14,状态 1,第 1 行
--违反了 PRIMARY KEY 约束 'PK__student__E53CAB217F60ED59'。不能在对象 'dbo.student' 中插入重复键。
--语句已终止。
 
--5)创建<strong>DDL触发器</strong>,在当前数据库中不允许删除或修改表
create trigger data
on database
for drop_table, alter_table
as
print '不允许删除或修改表'
rollback

转载自:https://www.cnblogs.com/julinhuitianxia/p/6823011.html

 

sqlserver触发器例子 一﹕ 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约`束。 二﹕ SQL Server为每个触发器都创建了两个专用表﹕Inserted表和Deleted表。这两个表由系统来维护﹐它们存在于内存中而不是在数据库中。这两个表的结构总是与被该触发器作用的表的结构相同。触发器执行 完成后﹐与该触发器相关的这两个表也被删除。 Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。 Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。 三﹕Instead of 和 After触发器 SQL Server2000提供了两种触发器﹕Instead of 和After 触发器。这两种触发器的差别在于他们被激活的同﹕ Instead of触发器用于替代引起触发器执行的T-SQL语句。除表之外﹐Instead of 触发器也可以用于视图﹐用来扩展视图可以支持的更新操作。 After触发器在一个Insert,Update或Deleted语句之后执行﹐进行约束检查等动作都在After触发器被激活之前发生。After触发器只能用于表。 一个表或视图的每一个修改动作(insert,update和delete)都可以有一个instead of 触发器﹐一个表的每个修改动作都可以有多个After触发器。 四﹕触发器的执行过程 如果一个Insert﹑update或者delete语句违反了约束﹐那幺After触发器不会执行﹐因为对约束的检查是在After触发器被激动之前发生的。所以After触发器不能超越约束。 Instead of 触发器可以取代激发它的操作来执行。它在Inserted表和Deleted表刚刚建立﹐其它任何操作还没有发生时被执行。因为Instead of 触发器在约束之前执行﹐所以它可以对约束进行一些预处理。 五﹕使用T-SQL语句来创建触发器 基本语句如下﹕ create trigger trigger_name on {table_name | view_name} {for | After | Instead of } [ insert, update,delete ] as sql_statement 六﹕相关示例﹕ 1﹕在Orders表中建立触发器﹐当向Orders表中插入一条订单记录时﹐检查goods表的货品状态status是否为1(正在整理)﹐是﹐则不能往Orders表加入该订单。 create trigger orderinsert on orders after insert as if (select status from goods,inserted where goods.name=inserted.goodsname)=1 begin print 'the goods is being processed' print 'the order cannot be committed' rollback transaction --回滚﹐避免加入 end 2﹕在Orders表建立一个插入触发器﹐在添加一条订单时﹐减少Goods表相应的货品记录中的库存。 create trigger orderinsert1 on orders after insert as update goods set storage=storage-inserted.quantity from goods,inserted where goods.name=inserted.goodsname 3﹕在Goods表建立删除触发器﹐实现Goods表和Orders表的级联删除。 create trigger goodsdelete on goods after delete as delete from orders where goodsname in (select name from deleted) 4﹕在Orders表建立一个更新触发器﹐监视Orders表的订单日期(OrderDate)列﹐使其不能手工修改. create trigger orderdateupdate on orders after update as if update(orderdate) begin raiserror(' orderdate cannot be modified',10,1) rollback transaction end 5﹕在Orders表建立一个插入触发器﹐保证向Orders表插入的货品名必须要在Goods表中一定存在。 create trigger orderinsert3 on orders after insert as if (select count(*) from goods,inserted where goods.name=inserted.goodsname)=0 begin print ' no entry in goods for this order' rollback transaction end --insert 触发器 create trigger tri_infoDetails_i on info_details after insert as declare @id int begin --delete from info_details where id= select @id=id from inserted; insert into info_details_index(TYPE,TITLE,content,POST_TIME,FLAG) select type,title,content,getdate(),1 from info_details where id=@id; --update info_details_index set content=content end; -- update触发器 --select top 0 type,title,content,getdate() as post_time,1 as flag into info_details_index from info_details; create trigger tri_infoDetails_u on info_details after update as declare @id int begin if exists(select 1 from inserted) if exists(select 1 from deleted) begin select @id=id from inserted; insert into info_details_index(TYPE,TITLE,content,POST_TIME,FLAG)select type,title,content,getdate(),-1 from info_details where id=@id; insert into info_details_index(TYPE,TITLE,content,POST_TIME,FLAG)select type,title,content,getdate(),1 from info_details where id=@id; end --update info_details_index set content=content end --delete触发器 create trigger tri_infoDetails_d on info_details after delete as declare @id int begin if exists(select 1 from deleted) begin insert into info_details_index(TYPE,TITLE, POST_TIME,FLAG) select type,title, getdate(),-1 from deleted info_details ; end end
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值