1. (单选题)在数据库系统中,保证数据及语义正确和有效的功能是 ( )
- A. 并发控制
- B. 存取控制
- C. 安全控制
- D. 完整性控制
2. (单选题)关于主键约束以下说法错误的是( )。
- A.一个表中只能设置一个主键约束
- B.允许空值的字段上不能定义主键约束
- C. 允许空值的字段上可以定义主键约束
- D. 可以将包含多个字段的字段组合设置为主键
3. (单选题)在表或视图上执行除了( )以外的语句都可以激活触发器。
- A. Insert
- B. Delete
- C. Update
- D. Create
4. (单选题)数据库的( )是指数据的正确性和相容性。
- A. 安全性
- B. 完整性
- C. 并发控制
- D. 恢复
5. (单选题)在数据库的表定义中,限制成绩属性列的取值在0到100的范围内,属于数据的( )约束。
- A. 实体完整性
- B. 参照完整性
- C. 用户自定义
- D. 用户操作
6. (填空题)数据库的完整性是指数据的 (①).(②)和(③)。
正确答案:
(1) 实体完整性
(2) 参照完整性
(3) 用户定义完整性
7. (填空题)实体完整性是指在基本表中,( )
正确答案:
主属性不能取空值
8. (填空题)参照完整性是指在基本表中( ) 。
正确答案:
外码可以是空值或者另一个关系主码的有效值
9. (填空题)为了保护数据库的实体完整性,当用户程序对主码进行更新使主码值不惟一时,DBMS就 ( ) 。
正确答案:
拒绝此操作
10. (简答题)试述触发器的概念和作用。
正确答案:
概念:触发器是用户定义在关系表上的一类由事件驱动的特殊过程,也是一种保证数据完整性的方法。触发器也可以看做是一类特殊的存储过程,一旦定义,无须用户调用,任何对表的修改操作均由服务器自动激活相应的触发器。
作用:能够实现主键和外键所不能保证的复杂的参照完整性和数据的一致性。
11. (简答题)什么是INSERTED表和DELETED表?试说明这两张表的结构。
正确答案:
INSERTED表:用于存储INSERT和UPDATE语句所影响的行的复本,执行INSERT和UPDATE语句时,新的数据行被添加到基本表中,同时这些数据行的备份被复制到INSERTED临时表中。
DELETED表:用于存储DELETE和UPDATE语句所影响的行的复本,执行DELETE或UPDATE语句时,行从触发器表中删除,并传输到DELETED表中,DELETED表和元数据表通常没有相同的行。
两张表的结构:①、这两个表都是逻辑表,并且是由系统管理的,存储在内存中,不是存储在数据库中。因此,不允许用户直接对其操作。
②、这两个表的结构与被该触发器作用的表有相同的表结构。它们是动态驻留在内存中,当触发器工作完成,它们也被删除。
③、这两个表主要保存因用户操作而被影响到的原数据值或新数据值,且是只读的,可以引用表中的数据,但不能向其写入内容。
12. (编程题)
已知:学生课程管理数据库包含以下表,请完成下列各题:
S(SNO,SNAME,SSEX,SAGE,SAGE,SDEPT);
C(CNO,CNAME,CCREDIT,CPNO);
SC(SNO.CNO,GRADE);
(1)在学生课程管理数据库中创建一触发器,当向学生选课表插入记录时,检查该记录的学号在学生表中是否存在,检查该记录的课程号在课程表中是否存在,及选课成绩是否在0到100范围,若有一项为否,则不允许插入。
正确答案:
create trigger stu_ins_tri
on sc
for insert
as
begin
declare @s# char(6),@c# char(5),@grade int
select @s#=sno,@c#=cno,@grade=score
from inserted
if (@s# not in(select sno from student)) or (@c# not in (select cno from course) )or (@grade not between 0 and 100)
rollback transaction
else
print '成功插入'
end;
13. (编程题)(2) 建立一个update触发器,当更新sc表中的score列时,触发器检查成绩是否提高10%。如果成绩超过了10%,将以ROLLBACK语句复原触发器和调用触发器语句,并打印“成绩升幅太大,更新失败!”,否则,打印“成绩更新成功!”。
正确答案:
alter trigger sc_update
on sc
for update
as
Begin transaction
declare @bgrade int,@acj int
select @bgrade=grade from deleted
print '更新前的成绩:'+cast(@bgrade as char(5));
select @acj=grade from inserted
print '更新后的成绩:'+cast(@acj as char(5));
if @acj>@bgrade*1.1
begin
raiserror('成绩升幅太大,更新失败!',16,1);
rollback;
return
end
--符合
print '成绩更新成功!'
commit transaction;
14. (编程题)
(3)利用update触发器,级联更新记录,即每当删除学生表S中的某条记录后,同时将SC表中该学生的选课记录一并删除。(注意:如果SC表上由外键,请将外键约束删除,否则此触发器不会起作用)
正确答案:
create trigger st_update
on s
for update
as
if update(sno)
begin
declare @bsno char(9),@asno char(9)
print '使用update触发器级联更新sc表中相关的行-开始'
select @bsno=sno from deleted
print '更新前的学号:'+@bsno
select @asno=sno from inserted
print '更新后的学号:'+@asno
update sc set sno=@asno where sc.sno=@bsno
print '使用update触发器级联更新sc表中相关的行-结束'
end
15. (编程题)(4)创建一个默认值,并绑定到学分列上,使学分默认为4个学分。
正确答案:
create default val_credit
as 4;
go
sp_bindefault val_dept,'c.ccredit';
16. (编程题)(5) 创建一个规则,使成绩大于等于零。并将其绑定到成绩列上。
正确答案:
CREATE RULE cj_rule
as
@cj>=0;
go
sp_bindrule cj_rule,'sc.grade';