数据库原理与应用(实验5)

一、实验目的和要求

 掌握数据库触发器的设计和使用方法。能够理解不同类型触发器的作用和执行原理。

二、实验内容

    (一)触发器实验用到的SC_U表的创建。

    (二)创建Insert触发器并验证其有效性。

    (三)创建Delete触发器并验证其有效性。

    (四)创建Update触发器并验证其有效性。

    (五)删除触发器。

三、实验仪器、设备

     PC一台 + Windows 操作系统 + SQL Server2008。

四、实验原理

    (一)关系数据库触发器机制。

    (二)关系数据库触发器操作语法,创建/触发/删除。

五、实验步骤

(一)创建触发器实验用到的SC_U表:

  表定义:SC_U(Sno,Cno,OldGrade,NewGrade)

Create Table SC_U

(

  Sno CHAR(8),

Cno CHAR(5),

OldGrade SMALLINT,  /*修改前的旧成绩*/

NewGrade SMALLINT,      /*修改后的新成绩*/

UpdateDate datetime       /*更新时间*/

);

(二)创建Insert触发器并验证其有效性

题目 2.1:定义一个触发器Student_insert,当插入一条记录到Student表时,在执行结果中输出“成功插入一条学号为XXXXXX的学生信息。”。例如:插入记录('20180022','李冬','男','2000-4-23','信息管理与信息系统')后,执行结果会输出“成功插入一条学号为20180020’的学生信息。”。

1、创建触发器

/*创建触发器,SQLServer与书上标准SQL有差异,具体SQLServer语句如下*/

Create TRIGGER Student_insert ON Student

After insert

AS

Begin

   Declare @num char(8)       /*SQLServer 声明变量要加 @ */

   Select  @num=Sno from inserted   /*系统将新插入的信息记录在inserted表中*/

   PRINT '成功插入一条学号为'+@num+'的学生信息。'

End;

2、验证有效性(请使用自己个人信息验证并放入实验报告


Insert into Student 
values('1221XXX','李XX','男','2000-4-23','信息管理与信息系统');

(三)创建Delete触发器并验证其有效性

题目 3.1:定义一个触发器Student_delete,当删除Student表的记录时,在执行结果中输出“被删除学生的学号”。

1、创建触发器

/**创建触发器,SQLServer与书上标准SQL有差异,具体SQLServer语句如下*/

Create TRIGGER Student_delete ON Student

After delete

AS

Begin

   /*系统将删除的学号查出来*/  

   Select Sno "被删除学生的学号" from deleted

End;

2、验证有效性(删除自己的个人记录,不要删除别的记录

delete from Student  where Sno ='1221XXX'; 

(四)创建Update触发器并验证其有性

题目 4.1:定义一个触发器SC_Update,当更新一名学生成绩时,将该学生的学号,姓名,旧成绩,新成绩和修改时间插入SC_U表中。接着使用select语句查询输出结果。

1、创建触发器

/*创建触发器,SQLServer与书上标准SQL有差异,具体SQLServer语句如下*/

Create TRIGGER SC_Update ON SC

After update

AS

Begin

   /*Update操作在SQLServer中分两个步骤,先delete再insert

,删除信息记录在deleted表中,插入信息记录在inserted表中*/

   /*将两表连接查询的结果插入SC_U表中*/

   Insert into SC_U(Sno,Cno,OldGrade,NewGrade,UpdateDate)

   Select deleted.Sno,deleted.Cno

         ,deleted.Grade "OldGrade",inserted.Grade "NewGrade"

 ,CURRENT_TIMESTAMP

   from deleted,inserted

   where deleted.Sno=inserted.Sno and deleted.Cno=inserted.Cno   

End;

2、验证有效性(使用自己的个人记录验证

/*验证触发器,如下是举例,请使用自己个人信息验证并截图放入实验报告*/

 /*验证数据注入*/

Insert into Student

values('自己学号','李冬','男','2000-4-23','信息管理与信息系统');

Insert into SC(Sno,Cno,Grade)

values('自己学号','81001',59);



/*更新SC表学生成绩,启动触发器*/

update SC

SET  Grade=99

where Sno='自己学号' and Cno='81001';

/*查询SC_U表,检查触发器是否生效。*/

Select * from SC_U;

(五)删除触发器

题目 5.1:删除本节实验课创建的三个触发器。

drop trigger Student_insert
drop trigger Student_delete
drop trigger SC_Update

 

题目 5.2:删除表SC_U

drop table SC_U

六、实验总结

       在进行数据库触发器的上机实验中,我深刻体会到了触发器在数据完整性和业务逻辑控制方面的重要作用。通过实际编写和测试触发器,我学会了如何在特定事件发生时自动执行预定的SQL语句,从而实现数据的自动化管理。例如,在插入、更新或删除操作后,触发器能够确保相关表的数据保持一致性。此外,实验过程中也遇到了一些挑战,如性能优化和错误处理,这让我认识到合理设计触发器的必要性。总体而言,这次实验不仅增强了我的实践技能,也为我理解数据库的高级功能奠定了坚实基础。

本次实验代码:

create database chenjialu
on primary
(name=chenjialu_data,  
filename='C:\chenjialu\chenjialu.mdf', 
size=5,  
maxsize=10,  
filegrowth=1)
log on
(name=chenjialu_log, 
filename='C:\chenjialu\chenjialu.ldf',  
size=2, maxsize=5, filegrowth=1)
create table student
(sno char(8) primary key,
sname varchar(20) unique,
ssex char(6),
sbirthdate date,
smajor  varchar(40)
);
select * from student
create table course
(cno char(5) primary key,
cname varchar(40) not null,
ccredit smallint,
cpno char(5),
foreign key (cpno)references course(cno)
);
select * from course
create table sc
(sno char(8),
 cno char(5),
 grade smallint,
 semester char(5),
 teachingclass char(8),
 primary key(sno,cno),
 foreign key(sno)references student (sno),
 foreign key(cno)references course (cno)
 );
  select * from sc
 insert into student (sno,sname,ssex,smajor,sbirthdate)
 values('20180009','陈冬','男','信息管理与信息系统','2000-5-22');
 insert into student 
 values('20180008','张怀民','男','2000-4-15','计算机科学与技术');
  insert into student
 values('20180001','李勇','男','2000-3-8','信息安全');
 insert into student 
 values('20180002','刘晨','女','1999-9-1','计算机科学与技术');
 insert into student
 values('20180003','王敏','女','2001-8-1','计算机科学与技术');
 insert into student
 values('20180004','张立','男','2000-1-8','计算机科学与技术');
 insert into student
 values('20180005','陈新奇','男','2001-11-1','信息管理与信息系统');
 insert into student
 values('20180006','赵明','男','2000-6-12','数据科学与大数据技术');
 insert into student
 values('20180007','王佳佳','女','2001-12-7','数据科学与大数据技术');
 insert into course values('81001','程序设计基础与C语言',4,NULL)
 insert into course values('81002','数据结构',4,81001)
 insert into course values('81003','数据库系统概论',4,81002)
 insert into course values('81004','信息系统概论',4,81003)
 insert into course values('81005','操作系统',4,81001)
 insert into course values('81006','Python语言',3,81002)
 insert into course values('81007','离散数学',4,NULL)
 insert into course values('81008','大数据技术概论',4,81003)
 insert into sc 
 values ('20180005','81004',NULL,'20202','81004-01')
 insert into sc
 values ('20180001','81001',85,'20192','81001-01');
 insert into sc
 values ('20180001','81002',96,'20201','81002-01');
 insert into sc
 values ('20180001','81003',87,'20202','81003-01');
 insert into sc 
 values ('20180002','81001',80,'20192','81001-02');
 insert into sc
 values ('20180002','81002',98,'20201','81002-01');
 insert into sc
 values ('20180002','81003',71,'20202','81003-02');
 insert into sc
 values ('20180003','81001',81,'20192','81001-01');
 insert into sc
 values ('20180003','81002',76,'20201','81002-02');
 insert into sc
 values ('20180004','81001',56,'20192','81001-02');
 insert into sc
 values ('20180004','81002',97,'20201','81002-02');
 insert into sc
 values ('20180005','81003',68,'20202','81003-01');
 Create Table SC_U 
( 
Sno CHAR(8), 
Cno CHAR(5), 
OldGrade SMALLINT,   
NewGrade SMALLINT,      
UpdateDate datetime       
);
select * from  SC_U ;

Create TRIGGER Student_insert ON Student 
After insert 
AS 
Begin 
Declare @num char(8)       
Select  @num=Sno from inserted   
PRINT '成功插入一条学号为'+@num+'的学生信息。' 
End;
select * from  student;

Insert into Student 
values('1221XXX','李XX','男','2000-4-23','信息管理与信息系统');
select * from  student;

Create TRIGGER Student_delete ON Student 
After delete 
AS 
Begin   
Select Sno "被删除学生的学号" from deleted 
End; 
delete from Student  where Sno ='1221XXX';

Create TRIGGER SC_Update ON SC 
After update 
AS 
Begin  
Insert into SC_U(Sno,Cno,OldGrade,NewGrade,UpdateDate) 
Select deleted.Sno,deleted.Cno 
,deleted.Grade "OldGrade",inserted.Grade "NewGrade" 
,CURRENT_TIMESTAMP 
from deleted,inserted 
where deleted.Sno=inserted.Sno and deleted.Cno=inserted.Cno    
End;
select * from  SC ;

Insert into Student
values('1221XXX','李XX','男','2000-4-23','信息管理与信息系统');
Insert into SC(Sno,Cno,Grade)
values('1221XXX','81001',59);
update SC
SET  Grade=99
where Sno='1221XXX' and Cno='81001';
Select * from SC;
drop trigger Student_insert
drop trigger Student_delete
drop trigger SC_Update
drop table SC_U

  • 31
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值