1、什么数据库完整性与数据库安全性的区别和联系
数据完整性:数据的正确性和相容性。
数据库的完整性和完全性是两个不同的概念,但他们有一定联系。
前者是为了防止数据库中存在不符合语义的数据,防止错误信息的输入和输出,即所谓垃圾进垃圾出所造成的无效操作和错误结果。
后者是保护数据库,防止被恶意破坏和非法存储。
也就是说,安全性措施的防范对象是非法用户和非法操作,完整性措施的防范对象是不符合语义的数据。
2、数据模型中完整性约束条件的概念,RDBMS的完整性控制机制应具有的功能
完整性约束条件:数据库中的数据所应满足的语义约束条件。
RDBMS的完整性控制机制应具有3个方面的功能:
3、用SQL实现完整性控制的方法
4、RDBMS如何实现参照完整性
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;