②设计在SC学期成绩表中插入各条记录,观察SQL Server会做何处理,为什么?如何解决所产生的问题? 代码如下:
由于外键约束fk_sid参照学生表,学生表中学号为1、2、3的记录不存在,所以在学期成绩表中无法插入。可以在学生表中插入记录的学号,再在学期成绩表中插入记录或者插入学生表存在的数据.
③使用查询设计器删除学期成绩表的外键fk_sid。 代码如下:
3.实验思考
(1) 在SQL Server中,可采用哪些方法实现数据完整性?
答:在SQL Server中,可以通过查询设计器和SQL Server管理平台实现数据完整性。例如使用关于各种约束、默认值、规则、断言和触发器等数据库对象的语句来保证数据完整性,以及在可视化界面完成部分操作
(2) 比较默认对象和默认约束的异同。
答:相同点:都能在输入记录时对未指定的数据自动插入默认的值。
不同点:默认约束是在create table 或 alter table 语句定义的,嵌入于表结构,而默认对象则独立于表之外,使用时需另外绑定到指定的列或数据类型,可以绑定到表的一列或多列,还可以用于用户自定义的数据类型
(3) 可以使用SQL Server管理平台创建规则和默认值对象吗?如果能,如何操作呢?
答:能。ALTER TABLE [dbo].[tbadmin] ADD
CONSTRAINT [DF_tbadmin_power] DEFAULT (1) FOR [power]
ALTER 表名 ADD CONSTRAINT[DF_表_字段] DEFAULT (值) FOR [字段]
(4) 在数据库中建立的规则不绑定到数据表的列上会起作用吗?为什么?
答:不会。创建规则后,规则只是存在于数据库中的对象,需要与与规则匹配的列或数据类型绑定才能起作用,才能最终完成创建规则的初衷。
(5) 请说明唯一约束和主键约束之间的联系和区别。 答:联系:本质上是索引,都是实体完整性约束。 区别:主键约束在表中定义一个主键来唯一确定表中每一行数据的标识符,非空且在表中只能有一个。唯一约束保证在一个字段或者一组字段里的数据与表中其它行的数据 相比是唯一,允许为空值,可以有多个。
实验心得
完整性约束是SQL中的一个重要概念,做这个实验的过程让我更加熟练了运用约束和定义约束
实验参考书目
《数据库系统概论》
31 / 50
实验六存储过程和触发器(2学时)
1.实验目的
(1) 掌握通过SQL Server管理平台和Transact-SQL语句CREATE PROCEDURE创建存储过程的方法和步骤。
(2) 掌握使用Transact-SQL语句EXECUTE执行存储过程的方法。 (3) 掌握通过SQL Server管理平台和Transact-SQL语句ALTER PROCEDURE修改存储过程的方法。
(4) 掌握通过SQL Server管理平台和Transact-SQL语句DROP PROCEDURE删除存储过程的方法。
(5) 掌握通过SQL Server管理平台和Transact-SQL语句CREATE TRIGGER创建触发器的方法和步骤。
(6) 掌握引发触发器的方法。
(7) 掌握使用SQL Server管理平台或Transact-SQL语句修改和删除触发器。
(8) 掌握事务、命名事务的创建方法,了解不同类型的事务的处理情况。
2.实验内容
(1) 输入以下T-SQL代码,创建一个利用流控制语句的存储过程
letters_print,该存储过程能够显示26个小写字母。
CREATE PROCEDURE letters_print AS
DECLARE @count int SET @count=0 WHILE @count<26 BEGIN
PRINT CHAR(ASCII('a')+ @count) SET @count=@count +1 END
32 / 50
使用EXECUTE命令执行letters_print存储过程。
如下图所示:
(2) 输入以下代码,创建存储过程stu_info,执行时通过输入姓名,可以查询该姓名对应的学生的各科成绩。
CREATE PROCEDURE stu_info @name varchar(40) AS
SELECT a.学号,姓名,课程编号,分数 FROM 学生 a INNER JOIN grade ta ON a.学号= ta.学号
WHERE 姓名= @name
代码如下:
使用EXECUTE命令执行存储过程stu_info,其参数值为“李春刚”。
代码如下:
如果存储过程stu_info执行时没有提供参数,要求能按默认值查询(设姓名为“李春刚”),如何修改该过程的定义?
代码如下:
(3) 使用学生情况数据库中的学生表、课程注册表、学期成绩表。
33 / 50
①创建一个存储过程stu_grade,查询学号为0001的学生的姓名、课程名称、分数。
代码如下:
②执行存储过程stu_grade,查询0001学生的姓名、课程名称、分数。
代码如下:
查询结果:
③使用系统存储过程sp_rename将存储过程stu_grade更名为stu_g。 更名前:更名后:
(4) 使用学生表、课程注册表、学期成绩表。
①创建一个带参数的存储过程stu_g_p,当任意输入一个学生的姓名时,将从3个表中返回该学生的学号、选修的课程名称和课程成绩。
代码如下:
②执行存储过程stu_g_p,查询“张三”的学号、选修课程和课程成绩。
代码如下:
查询结果:
③使用系统存储过程sp_helptext,查看存储过程stu_g_p的文本信息。
代码如下:
34 / 50
查询结果:
(5) 使用学生表。
代码如下:
①创建一个加密的存储过程stu_en,查询所有男学生的信息。
②执行存储过程stu_en,查看返回学生的情况。
代码如下:
查询结果:
③使用Transact-SQL语句DROP PROCEDURE删除存储过程stu_en。
代码如下:
(6) 使用学期成绩表。
①创建一个存储过程stu_g_r,当输入一个学生的学号时,通过返回输出参数获取该学生各门课程的平均成绩。
代码如下:(两个output参数)
②执行存储过程stu_g_r,输入学号0002。
代码如下: (执行的时候要再次声明output变量再带进去使用)
35 / 50