数据库||数据库的完整性

1.实验题目:数据库的完整性

2.实验目的和要求:

掌握数据库的实体完整性约束定义,完整性检查及违约处理方式。

掌握数据库的参照完整性约束定义,完整性检查及违约处理方式。

掌握数据库的用户定义完整性约束定义,完整性检查及违约处理方式。

掌握触发器的定义及使用。

 3.实验步骤:

  1. 按实验内容要求完成各项操作
  2. 根据题目要求给出解决方案
  3. 提交实验报告

4.实验内容:

1.完整性约束的定义

1.1 定义S, C表,定义实体完整性约束,定义学生的年龄在19到22岁之间,课程名唯一的约束

--建表
Create table S
(Sno char(10),
Sname char(10),
Sex char(10),
Age smallint  check (age <22 and age > 19),
Dept char(10),
Primary key(Sno)
)
Create table C
( Cno char(10),
Cname char(10) unique,
Ccredit char(10),
Cpno char(10),
Primary key (Cno)
)

Insert 
  Into S
  Values('42101','赵君君','男',19,'CS'),
        ('42102','赵小花','女',22,'MA'),
		('42103','赵小明','男',27,'MA'),
		('42104','赵宇宇','男',18,'CS'),
		('42105','赵兰兰','女',17,'IS');
Insert 
  Into C
  Values('1','CS','2',4),
        ('2','MA','3',2),
		('3','IS','1',7);

select * from S;
select * from C;

数据库||数据库的完整性_第1张图片

1.2 在C表中增加cpno字段,cpno字段为先修课号,定义cpno为外码,参照C表的cno,并定义当删除被参照表中相关记录时,要求违约处理方式为拒绝。

Alter table C

Add constraint FK_CPNO

FOREIGN key(CPNO)

REFERENCES C(CNO)

ON delete NO action

ON update NO action;

数据库||数据库的完整性_第2张图片

1.3 定义SC表的实体集参照完整性约束,要求当其被参照表发生删除操作时,S表违约处理的方式为级联,当其被参照表发生修改操作时,违约处理的方式为拒绝。

Create table sc

(SNO char(30),

CNO char(6),

GRADE smallint,

PRIMARY key(SNO,CNO),

FOREIGN key(sno) REFERENCES s(sno)

ON delete cascade

ON update NO action,

FOREIGN key(cno) REFERENCES c(cno)

ON delete cascade

ON update NO action);

数据库||数据库的完整性_第3张图片

2.触发器

2.1 建立一DML触发器,每当学生的成绩发生更新时,检查更新的学号是否满足0-100分之间,如果不满足则不允许更新,如满足则将更新的学号,成绩存入g-log表内

create trigger upsc on sc

for update

as  

     if update(g)

     begin

     declare @gr smallint

     select @gr=inserted.g from   inserted

     if (@gr<0 or @gr>100)

begin

   print'成绩录入不合规范'

   rollback transaction

end

   else  

    insert into glog select inserted.sno,g from  inserted

end 

数据库||数据库的完整性_第4张图片

2.2 建立一个INSTEAD OF触发器,一次只允许删除一条记录每当删除课程表中的记录超过一条时,则不允许删除,且给出提示信息“删除记录一次不可超过一条”

create trigger del_tri

on c

instead of delete

as

begin 

declare @n smallint

Select  @n=count(*) from deleted

If @n>1

Print 删除记录一次不可超过一条

rollback

End

数据库||数据库的完整性_第5张图片

5.实验总结

本次实验主要为了了解数据库的实体完整性约束定义,完整性检查及违约处理方式。

练习数据库的参照完整性约束定义,完整性检查及违约处理方式和数据库的用户定义完整性约束定义,完整性检查及违约处理方式。并且在一定程度上学习掌握触发器的用法。

6.思考题

1.参照完整性约束的违约判定和处理规则是什么?

答:参照完整性的违约判定和处理规则:

被参照表

参照表

违约处理

可能破坏参照完整性

插入元组

拒绝

可能破坏参照完整性

修改外码值

拒绝

删除元组

可能破坏参照完整性

拒绝(NO ACTION)/级联删除(CASCADE)/设置为空值

修改主码值

可能破坏参照完整性

拒绝(NO ACTION)/级联删除(CASCADE)/设置为空值

2.简述AFTER触发器和INSTEAD OF触发器的区别。

答:INSTEAD OF 触发器 用来代替通常的触发动作,即当对表进行INSERT、UPDATE 或 DELETE 操作时,系统不是直接对表执行这些操作,而是把操作内容交给触发器,让触发器检查所进行的操作是否正确。

AFTER 触发器 定义了对表执行了 INSERT、UPDATE 或 DELETE 语句操作之后再执行的操作。AFTER 触发器只能在表上指定,且动作晚于约束处理。每一个表上只能创建一个 INSTEAD OF 触发器,但可以创建多个 AFTER 触发器。

你可能感兴趣的:(数据库)