数据库系统概论习题

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';

 

猜你喜欢

转载自blog.csdn.net/qq_55795222/article/details/129463633
今日推荐