数据库系统概论五

1、什么数据库完整性与数据库安全性的区别和联系

数据完整性:数据的正确性和相容性。

数据库的完整性和完全性是两个不同的概念,但他们有一定联系。

前者是为了防止数据库中存在不符合语义的数据,防止错误信息的输入和输出,即所谓垃圾进垃圾出所造成的无效操作和错误结果。

后者是保护数据库,防止被恶意破坏和非法存储。

也就是说,安全性措施的防范对象是非法用户和非法操作,完整性措施的防范对象是不符合语义的数据。

 

2、数据模型中完整性约束条件的概念,RDBMS的完整性控制机制应具有的功能

完整性约束条件:数据库中的数据所应满足的语义约束条件。

RDBMS的完整性控制机制应具有3个方面的功能:

  1. 定义功能,即提供定义完整性约束条件的机制。
  2. 检查功能,即检查用户所发出的操作请求是否违背完整性约束条件。
  3. 违约反映,如果发现用户的操作请求使数据违背了完整性约束条件,则采取一定的措施来保证数据的完整性。

 

3、用SQL实现完整性控制的方法

 

 

4RDBMS如何实现参照完整性

RDBMS在现实参照完整性时需要考虑可能破坏参照完整性的各种情况,以及用户违约后的处理策略。

可能破坏参照完整性的4种情况:在参照关系中插入元祖、修改外码值时可能破坏参照完整性;在删除被参照表的元组、修改主码值时可能破坏参照完整性。

 

5、触发器的概念

触发器(Trigger)是用户定义在关系表上的一类由事件驱动的特殊过程,有时也叫 (Event-Condition-Action Rule)或ECA规则。

一旦定义,任何用户对表的增删改,均由服务器自动激活触发器,进行集中的完整性控制;可以进行更为复杂的检查和操作,具有更精细和更强大的数据控制能力。

目的:实现由主键和外键所不能保证的参照完整性和数据一致性,定义更复杂的约束和业务规则,可采用触发器。

1、定义触发器

CREATE TRIGGER语法格式

CREATE TRIGGER <触发器名> 

{BEFORE | AFTER} <触发事件(INSERT、UPDATE、DELETE

)> ON <表名>

        FOR EACH  {ROW | STATEMENT}

      [WHEN <触发条件>

        <触发动作体>

CREATE TRIGGER 必须是批处理中的第一条语句,并且只能应用于一个表。

触发器只能在当前的数据库中创建,但是可以引用当前数据库的外部对象。

定义触发器的语法说明:

1. 创建者:表的拥有者

2. 触发器名:表名和触发器必须在同一架构下

3. 表名:触发器的目标表

4. 触发事件:INSERT、DELETE、UPDATE

触发动作体与触发事件之间的关系:AFTER 、BEFORE 、INSTEAD OF,默认是AFTER

5.触发器类型:依照触发动作的间隔尺寸,行级触发器(FOR EACH ROW):触发动作体的执行次数根据目标表的行数决定;语句级触发器(FOR EACH STATEMENT):触发动作体只执行一次。

6. 触发条件:触发器激活(触发事件发生)后,如触发条件为真,触发动作体才会执行,省略WHEN触发条件,触发动作体在触发器激活后立即执行。

7. 触发动作体:触发动作体可以是一个匿名PL/SQL( Transact-SQL)过程块,也可以是对已创建存储过程的调用。如果触发动作体执行失败,激活触发器的事件会终止,目标表不发生变化。

8、存储过程(Stored Procedure):是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它 。

例:定义一个BEFORE行级触发器,为教师表Teacher定义完整性规则“教授的工资不得低于4000元,如果低于4000元,自动改为4000元”。

    CREATE TRIGGER Insert_Or_Update_Sal

         BEFORE INSERT OR UPDATE ON Teacher 

        /*触发事件是插入或更新操作*/

         FOR EACH ROW                      /*行级触发器*/

        AS BEGIN                   /*定义触发动作体,是PL/SQL过程块*/

              IF (new.Job='教授') AND (new.Sal < 4000) THEN  

              new.Sal :=4000;               

              END IF;

        END;                              

例:定义AFTER行级触发器,当教师表Teacher的工资发生变化后就自动在工资变化表Sal_log中增加一条相应记录

   首先建立工资变化表Sal_log

    CREATE TABLE Sal_log

        (Eno    NUMERIC(4)  references teacher(eno),

          Sal     NUMERIC(7,2),

          Username  char(10),

          Date   TIMESTAMP

         );

2、激活触发器

一个数据表上可能定义了多个触发器,同一个表上的多个触发器激活时遵循如下的执行顺序:(1) 执行该表上的BEFORE触发器。(2) 激活触发器的SQL语句。(3) 执行该表上的AFTER触发器。

例:当执行修改某个教师工资的SQL语句,激活上述定义的触发器 UPDATE Teacher SET Sal=800 WHERE Ename='陈平';   执行顺序是:

执行触发器Insert_Or_Update_Sal

执行SQL语句“UPDATE Teacher SET Sal=800 WHERE Ename='陈平';”

执行触发器Insert_Sal;

执行触发器Update_Sal

3、删除触发器      DROP TRIGGER <触发器名> ON <表名>;

触发器必须是一个已经创建的触发器,并且只能由具有相应权限的用户删除

例:删除教师表Teacher上的触发器Insert_Sal

     DROP TRIGGER Insert_Sal ON Teacher;

你可能感兴趣的:(数据库系统概论五)