《数据库原理与应用》实验报告
(实验名称 : 触发器的建立与使用 )
专 业 班 级 学 号 学生姓名 指导老师
怀化学院计算机科学与技术系
2011年 12月13日
《数据库原理与应用》实验报告
实验名称: 触发器的建立与使用
一、实验目的
理解触发器的概念和作用;了解触发器的分类及触发条件;掌握触发器的定义及应用。
二、实验内容:
1、 使用CREATE TRIGGER语句定义触发器,ALTER TRIGGER语句修改触发器,DROP TRIGGER语句删除触发器。
2、 触发器分AFTER/FOR和INSTEAD OF两种类型:AFTER/FOR类型的触发器是在相应的触发语句(insert、delete、update)执行完后被触发的。如果触发语句对应的表上有完整性约束,这些完整性约束必须不违背时,相应的触发语句才能执行,然后才能触发对应的AFTER/FOR类型的触发器。INSTEAD OF类型的触发器会在触发语句(insert、delete、update)执行之前被触发,并取代相应的触发语句。
3、 在表或视图上,每个INSERT、UPDATE或DELETE语句只能创建一个INSTEAD OF类型的触发器,无法为有外键约束且指定为级联删除或级联修改的表创建DELETE或UPDATE语句上的INSTEAD OF 类型的触发器。
SQL SERVER为每个触发器都创建了两个临时表INSERTED表和DELETED表,这两个表的逻辑结构与被触发器作用的表一样,用户可以读取这两个表的内容,但不能对它们进行修改,触发器执行完后,这两个表也会自动删除。当执行INSERT时,INSERTED表中保存要向表中插入的所有行;当执行DELETE时,DELETED表中保存要从表中删除的所有行;当执行UPDATE时,修改前的行保存在DELETED表中,修改后的行保存在INSERTED行中。
三、实验步骤与运行结果
1、针对employee表写一个DELETE触发器,显示删除的员工人数。 create trigger emp_delete on employee for delete as
declare @num int set @num=0
select @num=count(*) from deleted
- 1 -
print '删除的人数为:'+cast(@num as char(10))
delete from employee where sex='男'
drop trigger emp_delete
2、针对employee表写一个UPDATE触发器,限制每次工资额的变动不能超过原工资的20%。 create trigger update_emp on employee after update as
declare @new_salary float,@old_salary float select @old_salary=salary from deleted select @new_salary=salary from inserted
if ABS(@new_salary-@old_salary)>@old_salary*0.2
begin
print '每次工资额的变动不能超过原工资的20%' rollback transaction end
update employee set salary=salary*0.15
3、定义一个触发器,保证新添加的员工的工资不能超过5000元 create trigger upwy_emp on employee for insert as
if((select salary from inserted)>5000) begin
print '新添加的员工的工资不能超过5000元' rollback end
insert employee values('E0028','杨子','男','业务','职员','1980-12-1','1950-1-1',4600,'07345123596','昆明市')
insert employee values('E0029','陆毅','男','业务','职员','1980-12-2','1950-12-2',6200,'07343120496','上海市')
4、对sale_item表创建一个触发器,当插入一条销售明细记录时,如果该记录的产品数量超过5,则显示“欢迎成为本公司的VIP会员!” create trigger ins_sait on sale_item for insert as
if((select qty from inserted)>5) begin
print '欢迎成为本公司的VIP会员!' rollback
- 2 -
end
insert sale_item values('1004','P0008','6','10000','1996-11-10')
5、针对customer表,定义一触发器用来保证参照完整性,当删除某一客户时,将其它表中该客户相关的信息全部删除。
create trigger del_cus on customer instead of delete as
delete customer where cust_id in(select cust_id from deleted) delete sales where cust_id in(select cust_id from deleted)
delete customer where cust_name='客户乙'
select * from customer select * from sales 6、针对sales表,定义一触发器保证参照完整性(参照customer表),不允许向sales表中插入customer表中不存在的客户。
create trigger unin_sales on sales instead of insert as
if((select count(*) from customer where cust_id in(select cust_id from inserted))<0) begin
print'不允许向sales表中插入customer表中不存在的客户' rollback end
insert sales values (10002,'C0556','E0013',22700.00,'1996-11-10','I000000002')
drop trigger unin_sales 7、 针对employee表,定义一触发器用来保证实体完整性,阻止用户修改Employee表中的emp_no列。.
create trigger unaf_emp on employee for update as
declare @emp_id_i char declare @emp_id_d char
select @emp_id_i=emp_no from inserted select @emp_id_d=emp_no from deleted
if @emp_id_i<>@emp_id_d begin
print'不能修改employee表中的emp_no列' rollback
- 3 -
end
update employee set emp_no='45645' where emp_no='E0008'
四、实验总结
通过本次实验我学会了对触发器的使用和创建,以及如何修改触发器、删除触
发器。还学会了如何利用触发器创建的两个临时表INSERTED表和DELETED表进行修改操作。
- 4 -