【MySQL】《数据库系统》-实验项目8-触发器

实验项目
实验1  实验环境与操作流程
实验2  数据定义、查询与更新
实验3  基本表的定义、删除与修改
实验4  数据的插入、修改和删除
实验5  数据的查询
实验6  数据的视图
实验7  完整性语言
实验8  触发器
实验9  存储过程与函数
实验10  SQL语句1(创建、插入、查询)
实验11  SQL语句2(查询)
实验12  SQL语句3(视图、完整性、关系代数查询)

实验8  触发器

一、实验目的

1. 理解触发器的基本概念及分类;

2. 掌握触发器的基本操作。

二、实验要求

1. 掌握触发器的定义;

2. 熟练掌握触发器的基本操作。

三、实验内容

(参考课本5.7节)

(命令1:show triggers;查看触发器。)

(命令2:delimiter XXX设置分隔符为XXX。delimiter ;取消自己设置的分隔符。)

  • 创建触发器:
  1. 导入备份:导入数据库student_course,以及基本表Student、Course、SC,以及其表中的数据。
  2. 创建触发器1:当对表SC的Grade属性进行修改时,若分数增加了10%。则将此次操作记录到另一个表SC_U(Sno、Cno、Oldgrade、Newgrade)中,其中Oldgrade是修改前的分数,Newgrade是修改后的分数,参考例5.21。
  3. 创建Teacher表:建立教师表TEACHER(Eno,Ename,Job,Sal,Deduct),参考例5.11。
  4. 创建触发器2:定义一个EEFORE行级触发器,为教师表Teacher定义完整性规则“教授的工资不得低于4000元,如果低于4000元,自动改成4000元”,参考例5.23。
  • 验证触发器:
  1. 验证触发器1:修改SC表中学号为201215121的同学选修的3号课程的成绩,由88修改为90,查看是否激活了触发器。
  2. 验证触发器1:修改SC表中学号为201215122的同学选修的3号课程的成绩,由80修改为90,查看是否激活了触发器。
  3. 验证触发器2:向Teacher表插入一条记录(教职工号:2001,教职工名:张明,工作:副教授,工资项:3950,扣除项:58.2),查看是否激活了触发器。
  4. 验证触发器2:向Teacher表插入一条记录(教职工号:2002,教职工名:赵玲,工作:教授,工资项:3950,扣除项:58.2),查看是否激活了触发器。
  • 删除上述两个触发器。

实验指导:

  • 创建触发器:
  • 导入备份:导入数据库student_course,以及基本表Student、Course、SC,以及其表中的数据。
  • 创建触发器1:当对表SC的Grade属性进行修改时,若分数增加了10%。则将此次操作记录到另一个表SC_U(Sno、Cno、Oldgrade、Newgrade)中,其中Oldgrade是修改前的分数,Newgrade是修改后的分数,参考例5.21。

  • 创建Teacher表:建立教师表TEACHER(Eno,Ename,Job,Sal,Deduct),参考例5.11。

  • 创建触发器2:定义一个EEFORE行级触发器,为教师表Teacher定义完整性规则“教授的工资不得低于4000元,如果低于4000元,自动改成4000元”,参考例5.23。

  • 验证触发器:
  • 验证触发器1:修改SC表中学号为201215121的同学选修的3号课程的成绩,由88修改为90,查看是否激活了触发器。

(创建SC_U表,为了验证)

(未激活触发器)

  • 验证触发器1:修改SC表中学号为201215122的同学选修的3号课程的成绩,由80修改为90,查看是否激活了触发器。

(激活触发器)

  • 验证触发器2:向Teacher表插入一条记录(教职工号:2001,教职工名:张明,工作:副教授,工资项:3950,扣除项:58.2),查看是否激活了触发器。

(未激活触发器)

  • 验证触发器2:向Teacher表插入一条记录(教职工号:2002,教职工名:赵玲,工作:教授,工资项:3950,扣除项:58.2),查看是否激活了触发器。

(激活触发器)

  • 删除上述两个触发器。



实验8代码:

show triggers;

delimiter $$

create trigger SC_T
after update on SC
for each row
if(New.Grade>=1.1*Old.Grade)
  then
    insert into SC_U(Sno,Cno,OldGrade,NewGrade)
    values(Old.Sno,Old.Cno,Old.Grade,New.Grade);
end if $$

delimiter ;

create table Teacher(Eno numeric(4) primary key,Ename char(10),Job char(8),Sal numeric(7,2),Deduct numeric(7,2));

delimiter $$

create trigger InRR
    before insert on Teacher
    for each row
    begin
    if(New.Job='教授') and (New.Sal<4000)
    then
    set New.Sal:=4000;
    end if;
    end $$

delimiter ;

create table SC_U(Sno char(9), Cno char(4),OldGrade smallint,NewGrade smallint);

update SC set Grade=90 where Sno='201215121' and Cno='3';

update SC set Grade=90 where Sno='201215122' and Cno='3';

insert into Teacher values('2001','张明','副教授',3950,58.2);

insert into Teacher values('2002','张明','教授',3950,58.2);

drop trigger SC_T;

drop trigger InRR;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值