1、实验目的
(1)了解 SQL Serer 数据库系统中数据完整性控制的基本方法
(2)熟练掌握常用 CREATE 或 ALTER 在创建或修改表时设置约束
(3)了解触发器的机制和使用
(4)验证数据库系统数据完整性控制
2、实验平台
使用 SQL Server 数据库管理系统提供的 SSMS 和查询编辑器。
3 实验内容及要求
结合 ST 数据库中的各个表,设置相关的约束,要求包括主键约束、外键约束、唯一约束、
检查约束、非空约束等,掌握各约束的定义方法。
设置一个触发器,实现学生选课总学分的完整性控制,了解触发器的工作机制。
设计一些示例数据,验证完整性检查机制。
要求包括如下方面的内容:
3.1 使用 SQL 语句设置约束
使用 CREATE 或 ALTER 语句完成如下的操作,包括:
1. 设置各表的主键约束
2. 设置相关表的外键
3. 设置相关属性的非空约束、默认值约束、唯一约束
4. 设置相关属性的 CHECK 约束
3.2 使用触发器
创建一个触发器,实现如下的完整性约束:
当向 SC 表中插入一行数据时,自动将学分累加到总学分中。
记录修改学分的操作。
3.4 检查约束和触发器
分别向相关表插入若干条记录,检查你设置的完整性约束是否有效:
1. 插入若干条包含正确数据的记录,检查插入情况
2. 分别针对设置的各个约束,插入违反约束的数据,检查操作能否进行
3. 向 SC 表插入若干行数据,检查触发器能否实现其数据一致性功能。
4
实验报告
要求写出实验的基本过程。解释操作过程中出现的现象。
Student参考示例:
建立一个学生选课数据库,熟悉约束及触发器的使用方法。
一、声明完整性约束
创建学生选课数据库 TEST,包括三个基本表,其中 Student 表保存学生基本信息,Course
表保存课程信息,SC 表保存学生选课信息,其结构如下表:
表 1. Student 表结构
表 2. Course 表结构
表 3. SC 表结构
1.创建基本表及约束
(1)创建 Student 表
CREATE TABLE Student
( Sno CHAR(8) PRIMARY KEY,
Sname CHAR(8) NOT NULL,
Ssex CHAR(2) CHECK( Ssex in ('男','女')),
Sage SMALLINT,
Sdept CHAR(20),
Sclass CHAR(4) NOT NULL,
Stotal smallint DEFAULT 0
);
掌握主键约束、非空约束、CHECK 约束、默认值的定义格式。
(2)创建 Course 表
CREATE TABLE Course
( Cno CHAR(4) CONSTRAINT FK_Course PRIMARY KEY,
Cname CHAR(40),
Cpno CHAR(4) ,
Ccredit SMALLINT
);
(3)创建 SC 表
CREATE TABLE SC
( Sno CHAR(8) FOREIGN KEY (Sno) REFERENCES Student(Sno),
Cno CHAR(4),
Grade SMALLINT CONSTRAINT SC_CHECK CHECK(Grade >0 AND Grade<100),
PRIMARY KEY (Sno,Cno),
CONSTRAINT FK_SC FOREIGN KEY (Cno) REFERENCES Course(Cno)
);
掌握多个属性的主键约束、外键约束、CHECK 约束的定义格式。
掌握约束的命名方式。
(4)检查表是否创建成功。
2. 插入数据
将如下表格中的数据分别插入到数据库相应的表中:
表 4.学生基本信息表
表 5.课程信息表
表 6.学生选课信息表
(1)插入学生信息到Student表
INSERT INTO Student VALUES('20100001','李勇','男',20,'CS','1001',0)
INSERT INTO Student VALUES('20100002','刘晨','女',19,'CS','1001',0)
请写出插入其余行的插入语句,并插入数据。
(2)插入到课程信息到Course表
INSERT INTO Course(Cno,Cname,Cpno,Ccredit) VALUES('1','数据库系统原理', '5',4)
INSERT INTO Course(Cno,Cname,Cpno,Ccredit) VALUES('2','高等数学', null,2)
请写出插入其余行的插入语句,并插入数据。
(3)插入到SC表
INSERT INTO SC VALUES('20100001','1',92)
INSERT INTO SC VALUES('20100002','2',80)
请写出插入其余行的插入语句,并运行。
(4)检查插入到表中的数据
3. 修改约束
对数据库中已经存在的表,可对其增加约束或修改已存在的约束:
(1)添加约束
ALTER TABLE Course ADD UNIQUE(Cname)
ALTER TABLE Course ADD FOREIGN KEY (Cpno) REFERENCES Course(Cno)
掌握如何添加约束
掌握如何声明唯一约束
(2)修改约束
ALTER TABLE SC DROP CONSTRAINT SC_CHECK
ALTER TABLE SC ADD CONSTRAINT SC_CHECK CHECK(Grade >=0 AND Grade<=100)
掌握如何修改约束
理解命名约束的优点
二、检查完整性约束
通过修改数据库中的数据检查完整性约束条件的作用。
1.检查主键约束
(1)执行下面的语句修改Student表,观察语句能否正确运行,解释为什么?
INSERT INTO Student VALUES('20100101','李斌','男',20,'CS','1001',0)
INSERT INTO Student VALUES('20100001','李斌','男',20,'CS','1001',0)
UPDATE Student SET Sno='20100021' WHERE Sname = '张立'
(2)执行下面的语句修改SC表,观察语句能否正确运行,解释为什么?
INSERT INTO SC VALUES('20100001','1',78)
INSERT INTO SC VALUES('20100001',null,78)
2.检查唯一约束
执行下面的语句修改Course表,观察语句能否正确运行,解释为什么?
INSERT INTO Course VALUES('8','JAVA',7, 3)
INSERT INTO Course VALUES('9','数据结构',7, 3)3.检查默认值、允许空值列
运行如下的语句:
INSERT INTO Student(Sno,Sname,Ssex,Sclass) VALUES('20100102','张盛','男','1008')
观察插入数据行的数值
SELECT * FROM Student WHere Sno='20100102'
4.检查非空约束
下面的语句包含空值,检查运行结果,解释为什么?
INSERT INTO Student(Sno,Sname,Ssex,Sclass) VALUES('20100103','张盛','男',NULL)
INSERT INTO Student(Sno,Sname,Ssex) VALUES('20100104','张盛','男')
5.检查 CHECK 约束
执行下面的语句,解释其运行结果。
INSERT INTO SC VALUES('20100001','4',95)
INSERT INTO SC VALUES('20100001','4',102)
INSERT INTO Student(Sno,Sname,Ssex,Sclass) VALUES('20100103','张盛','男','1008')
INSERT INTO Student(Sno,Sname,Ssex,Sclass) VALUES('20100104','张盛','','1008')
6.检查外键约束
(1)执行下面的语句检查外键约束的作用
INSERT INTO SC VALUES('20100301','1',95)
INSERT INTO SC VALUES('20100001','10',95)
UPDATE SC SET Cno = '10' Where Cno='1'
UPDATE Course SET Cno = '10' Where Cno='3'
(2)执行下面的语句检查对被引用表的约束
DELETE Student WHERE Sno='20100021'
DELETE Student WHERE Sno='20100001'
UPDATE Course SET Cno = '10' WHERE Cname = '数据库系统原理'
三、触发器的定义及使用
1.定义触发器
(1)定义一个触发器,实现有关学分的完整性约束:当向SC表插入一行选课记录时,自动
将该课程的学分累加到该学生的总学分中。
CREATE TRIGGER tr_INSERT ON SC
FOR INSERT
AS
--声明变量
DECLARE @sno char(8) DECLARE @cridit int
DECLARE @cno char(4)
--提取插入的数据
SELECT @sno=Sno,@cno=Cno FROM inserted
--提取学生的总学分
SELECT @cridit = Ccredit
FROM SC join Course ON (SC.Cno = Course.Cno)
WHERE SC.Cno = @cno
--更新总学分
UPDATE Student SET Stotal = Stotal + @cridit
WHERE Sno = @sno
GO
(2)定义一个触发器,实现对SC表的操作登记:当用户向SC表插入或修改时,记录该操作
到数据库中。
创建日志登记表:
CREATE TABLE LOG_TABLE
(
username char(10), --操作人员
date datetime, --修改时间
Sno char(8) , --学生学号
Cno char(4) --课程号
)
创建日志登记触发器:
CREATE TRIGGER tr_UPDATE ON SC
FOR INSERT,UPDATE
AS
DECLARE @sno char(8)
DECLARE @cno char(4)
DECLARE @new smallint
SELECT @sno=Sno,@cno=Cno FROM inserted
INSERT INTO LOG_TABLE VALUES(CURRENT_USER,getdate(),@Sno,@Cno);
GO
(3)执行插入操作,触发触发器:
INSERT INTO SC VALUES('20100001','6',95)
(4)验证触发器是否触发
select * from student
select * from LOG_TABLE
本文来自博客园,作者:一路向北~~,转载请注明原文链接:https://www.cnblogs.com/ylxb2539989915/p/16335965.html