一、实验目的和要求
掌握数据库触发器的设计和使用方法。能够理解不同类型触发器的作用和执行原理。
二、实验内容
(一)触发器实验用到的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