数据库第六次试验:数据库的完整性

前言

为了帮助同学们完成痛苦的实验课程设计,本作者将其作出的实验结果及代码贴至CSDN中,供同学们学习参考。如有不足或描述不完善之处,敬请各位指出,欢迎各位的斧正!

一、实验目的

1、掌握 SQL Server 中的关系图创建向导的使用方法,加深对SQL Server关系图作用的理解。
2、掌握数据库触发器的设计和使用方法。

二、实验内容

1、创建、编辑和删除数据库关系图。
2、定义触发器,理解不同类型触发器的作用和执行原理。验证触发器的有效性。

三、实验原理、方法和手段

1、创建关系图
假如要在图书_读者数据库中建立一个读者_借阅_图书关系,要求该关系图包括图书、借阅和读者三个表,并包括它们之间的“图书.书号=借阅.书号 AND 借阅.读者借书证号=读者.借书证号”的外码与被参照表之间的关联。在企业管理器中通过向导建立数据库关系图。
如图 6.1 所示,选中“数据库关系图”,单击鼠标右键,选择“新建数据库关系图”。
在这里插入图片描述
图 6.1
在“添加表” 窗口中选中所有表,点击“添加”按钮,进入数据库关系图设计窗口。
在这里插入图片描述
图 6.2
数据库关系图设计窗口如图 6.3 所示。
在这里插入图片描述
图 6.3
如图 6.4 所示,可以使用鼠标右键删除表之间的关系。
在这里插入图片描述
图 6.4
用鼠标指针指向 table_book 表主码列左边的选择栏,然后按下鼠标左键,并向table_borrow 表中的外码列处拖动,创建表间关系。如图 6.5 所示。
在这里插入图片描述
图 6.5
出现“表和列”对话框,列出了当前所选择的主码和外码,点击“确定”按钮。
在这里插入图片描述
图 6.5
在出现的“外键关系”对话框中点击“确定”按钮。
在这里插入图片描述
图 6.6
即建立了 table_borrow 表的外码 book_no,对应被参照关系 table_book 的主码book_no。如图 6.7 所示。
在这里插入图片描述
图 6.7
点击图标,出现保存该数据库关系图的窗口,输入关系图名,点击“确定”按钮,将新建的关系图存盘。
在这里插入图片描述
图 6.8
2、编辑数据库关系图
在企业管理器中,展开数据库关系图所属的服务器、数据库文件夹、数据库以及关系表文件夹。用鼠标右键单击要编辑的关系表,在弹出的菜单中选择“修改”项,则弹出编辑关系表的对话框,数据库关系表中的所有操作都是在该对话框中完成的。
在这里插入图片描述
图 6.9
3、数据库关系图的删除
在企业管理器中,用鼠标右键单击欲删除的数据库关系图。在弹出的菜单上选择“删除”项。在随后出现的删除对象对话框中单击“确定”按钮,即可删除该数据库中被选中的关系图。如图 6.10,6.11 所示。
在这里插入图片描述
图 6.10
在这里插入图片描述
图 6.11
4、创建触发器
当对某一个表进行 update、insert、delete 这些操作的时候,系统会自动调用执行该表上对应的触发器。SQL Server 中的 DML 触发器分为: after 触发器(之后触发,也叫“FOR”触发器))和 instead of 触发器 (之前触发)。其中 after 触发器要求只有执行某一操作 insert、update、delete 之后触发器才被触发,且只能定义在表上。而 instead of 触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义 instead of 触发器,也可以在视图上
定义。
触发器有两个特殊的表:插入表(instered 表)和删除表(deleted 表)。这两张是逻辑表也是虚表。由系统在内存中创建者两张表,不会存储在数据库中。而且两张表都是只读的,只能读取数据而不能修改数据。这两张表的结果总是与触发器应用的表的结构相同。当触发器完成工作后,这两张表就会被删除。Inserted 表的数据是插入或是修改后的数据,而 deleted 表的数据是更新前的或是删除的数据。
注意的是:触发器本身就是一个事务,所以在触发器里面可以对修改数据进行一些特殊的检查。如果不满足可以利用事务回滚,撤销操作。
(1)创建 after 触发器的语法为:

create trigger tgr_name
on table_name
with encrypion –加密触发器
 for update...
as
 Transact-SQL

(2)创建 instead of 触发器的语法为:

create trigger tgr_name
on table_name
with encryption
 instead of update...
as
 T-SQL

四、实验组织运行要求

本实验属于验证型实验,通过实验,加强对课堂讲授知识的理解。开始实验前,必须进行预习,实验过程中,先集中由老师进行具体要求和注意事项的讲解,然后各自独立在机器上完成实验。实验过程中出现问题,在实验指导老师帮助下解决。

五、实验条件

(1)硬件条件:个人计算机。
(2)软件条件:Windows;MS SQL Server。

六、实验步骤

1、基本操作实验
(1) 在 SQL Server 企业管理器中调出 Create Diagram Wizard(创建图表向导),完成在图书_读者数据库中建立一个图书_借阅关系图的操作。要求该关系图包括图书和借阅两个表,并包括图书与借阅之间的“图书.书号=借阅.书号”的外码与被参照表之间的关联。
(2) 对建立的关系图进行修改、删除等操作。
(3)设计触发器及实现
1)在学生课程数据库的 SC 表上定义一个 INSERT,UPDATE 触发器(after 触发器),当插入或修改该表时,如果成绩<60,则自动修改成绩为 60。

CREATE TRIGGER triggrad ON SC FOR INSERT,UPDATE AS
 DECLARE @GRADE smallint
 SELECT @GRADE=Grade FROM inserted
 IF @GRADE<60
 BEGIN
 update Sc set Grade=60 
 from SC,Inserted i
 where sc.Sno=i.Sno and SC.Cno=i.Cno
 END
  1. 在学生课程数据库的 Student 表上定义一个 DELETE 触发器(instead of),当删除某个学生的信息时,先删除 SC 表中该学生的选课信息,再删除 Student 表中的信息。
create trigger tgr_Student_inteadOf
on Student
 instead of delete /*, update, insert*/
as
 declare @Sno char(10), @Sname char(20);
 --查询被删除的信息,并赋值
 select @Sno = Sno, @Sname = Sname from deleted;
 print 'Sno: ' + @Sno + ', Sname: ' + @Sname;
 --先删除SC的信息
 delete SC where Sno = @Sno;
 --再删除Student的信息
 delete Student where Sno = @Sno;
 print '删除[ Sno: ' + @Sno + ', name: ' + @Sname + ' ] 的信息成功!';
go
  1. 验证触发器。
    2、提高操作实验
    在自设计的数据库应用项目中创建关系图并设计触发器。

七、思考题

1、写出实现所有操作要求的 SQL 语句。

八、实验报告

1、基本操作实验
(1) 在 SQL Server 企业管理器中调出 Create Diagram Wizard(创建图表向导),完成在图书_读者数据库中建立一个图书_借阅关系图的操作。要求该关系图包括图书和借阅两个表,并包括图书与借阅之间的“图书.书号=借阅.书号”的外码与被参照表之间的关联。
在这里插入图片描述

(2)对建立的关系图进行修改、删除等操作。
删除:在这里插入图片描述
增加列:
在这里插入图片描述
(3)设计触发器及实现
1)在学生课程数据库的 SC 表上定义一个 INSERT,UPDATE 触发器(after 触发器),当插入或修改该表时,如果成绩<60,则自动修改成绩为 60。

CREATE TRIGGER triggrad ON SC FOR INSERT,UPDATE AS
 DECLARE @GRADE smallint
 SELECT @GRADE=Grade FROM inserted
 IF @GRADE<60
 BEGIN
 update Sc set Grade=60 
 from SC,Inserted i
 where sc.Sno=i.Sno and SC.Cno=i.Cno
 END
  1. 在学生课程数据库的 Student 表上定义一个 DELETE 触发器(instead of),当删除某个学生的信息时,先删除 SC 表中该学生的选课信息,再删除 Student 表中的信息。
 create trigger tgr_Student_inteadOf on Student
 instead of delete /*, update, insert*/
as
 declare @Sno char(10), @Sname char(20);
 --查询被删除的信息,并赋值
 select @Sno = Sno, @Sname = Sname from deleted;
 print 'Sno: ' + @Sno + ', Sname: ' + @Sname;
 --先删除SC的信息
 delete SC where Sno = @Sno;
 --再删除Student的信息
 delete Student where Sno = @Sno;
 print '删除[ Sno: ' + @Sno + ', name: ' + @Sname + ' ] 的信息成功!';
Go

3)验证触发器。
(1)执行插入学号为001同学,课程号为121的成绩
在这里插入图片描述

insert into SC values ('001','121',50)

执行效果如下:
在这里插入图片描述

此时插入数据变更如下:
在这里插入图片描述

(2)执行删除学号为001同学的sql语句:
在这里插入图片描述

delete from Student where sno='001'

执行效果如下:
在这里插入图片描述

此时表格中已无sno为001同学的信息:
在这里插入图片描述

2、提高操作实验
在自设计的数据库应用项目中创建关系图并设计触发器。
自创建的数据库的数据库关系图如下所示:
在这里插入图片描述

设计触发器代码如下所示:

CREATE TRIGGER triggrad ON BORROW FOR INSERT,UPDATE AS
 DECLARE @date date
 SELECT @date=BRdate FROM inserted
 IF @date<'2021-1-1'
 BEGIN
 update BORROW set BRdate='2020-1-1'  from BORROW,Inserted i where BORROW.Rno=i.Rno and BORROW.Bno=i.Bno
 END

执行插入BORROW表编号为Rno的读者与2019-1-1借Bno为2书的信息:

insert into BORROW values(1,2,'2019-1-1')

语句执行效果如下:
在这里插入图片描述

插入后表格信息如下:
在这里插入图片描述

数据库完整性实验实验完整代码 打开ScoreDB数据库,完成以下操作: (1)分别定义ScoreDB数据库中各基表的主键、外键,实现实体完整性约束和参照完整性约束; (2)往student表插入一条跟已有的学号相同的学生数据,验证实体完整性约束; (3)向score表中插入一条数据,其中数据中的课程编号是课程表中没有的,验证参照完整性约束; (4)修改score表中一条数据的课程编号,该编号是课程表中没有的,验证参照完整性约束; (5)删除student表中的一条数据(其中学号出现在score表中),验证参照完整性约束。 (6)增加score表的约束条件,要求成绩在0-100之间。增加student表的约束条件,要求性别只允许取“男”或“女”。 (7)创建一个触发器student_update,实现功能:如果在学生表中修改了学号,则自动修改成绩表中的学号。 (8)创建一个级联删除触发器student_delete。要求:当从学生表中删除某学生信息时,同时删除score表中此学生相关的选课记录。 (9)创建一个触发器student_insert,实现功能:如果往学生表中插入数据,则自动修改班级表中的班级人数classNum。(如果改为删除数据,代码要怎么改?) (10)建立一个触发器course_check,每当删除课程表中记录时,先检查此课程是否已被选修,如选修则不允许删除,且给出提示信息“此课程已有学生选修,无法删除!”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Knight_V_Schumacher

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值