数据库完整性--断言和触发器

一、断言

在SQL中可以使用数据定义语言中的CREATE ASSERTION语句,通过声明性断言来指定更具一般性的约束。可以定义涉及多个表或聚集操作的比较复杂的完整性约束。断言创建以后,任何对断言中所涉及关系的操作都会触发关系数据库管理系统对断言的检查,任何使断言不为真值的操作都会被拒绝执行。

1、创建断言的语句格式

CREATE ASSERTION<断言名>< CHECK子句>
每个断言都被赋予一个名字,

2、删除断言的语句格式

DROP ASSERTION <断言名>;
备注:如果断言很复杂,则系统在检测和维护断言上的开销会比较高,因此要注意是否使用断言。

二、触发器

触发器(trigger)是用户定义在关系表上的一类由事件驱动的特殊过程。一旦定义,触发器将被保存在数据库服务器中,任何用户对表的增删改操作均由服务器自动激活相应的触发器,在关系数据库管理系统核心层进行集中的完整性控制。

1、定义触发器

触发器又叫做事件-条件-动作规则。当特定的系统事件(如对一个表进行增删改操作,事务的结束)发生时,对规则的条件进行检查,如果条件成立则执行规则中的动作,否则就不执行。规则中的动作体可以很复杂,可以涉及其他表和其他数据库对象,通常是一段SQL存储过程。
SQL使用CREATE TRIGGER命令建立触发器,其格式:CREATE TRIGGER<触发器名> –(每当触发事件发生时该触发器被激活)
{BEFORE|AFTER}<触发事件>ON<表名> –(指明触发器激活的时间在执行触发器事件前或后)
REFERENCING NEW|OLD ROW AS<变量> –(REFERENCING指出引用的变量)
FOR EACH{ROW|STATEMENT} –(定义触发器的类型,指明动作体执行的频率)
[WIEN <触发条件>]<触发动作体> –(近当触发条件为真时才执行触发动作体)
说明
1. 只有表的拥有者,即创建表的用户才可以在表上创建触发器,并且一个表上只能创建一定数量的触发器。触发器的具体数量由具体的关系数据库管理系统在设计时确定。
2. 触发器名可以包含模式名,也可以不包含模式名。同一模式下,触发器名必须是唯一的,并且触发器名和表名必须在同一模式下。
3. 触发器只能定义在基本表上,不能定义在视图上。当基本表的数据发生变化时,将激活定义在该表上相应触发器事件的触发器,因此该表也成为触发器的目标表。
4. 触发事件可以是INSERT、DELETE或UPDATE,也可以是这几个事件的组合,如INSERT OR DELETE等,还可以说UPDATE OF<触发列,…>,即进一步指明修改哪些列时激活触发器。AFTER/DEFORE是触发器的时机。AFTER表示触发事件的操作执行之后激活触发器;DEFORE表示触发器事件的操作执行之前激活触发器。
5. 触发器按照所触发动作的间隔尺寸可以分为行级触发器(FOR EACH ROW)和语句级触发器(FOR EACH STATEMENT)。
6. 触发器被激活时,只有当触发条件为真时触发动作体才执行,否则触发动作体不执行。如果省略WHEN触发条件,则触发动作体在触发器激活后立即执行。
7. 触发动作体既可以是一个匿名PL/SQL过程块,也可以说对已创建存储过程的调用。如果说行级触发器,用户可以在过程体中使用NEW和OLD引用UPDATE/INSERT事件之后的新值和UPDAET/DELETE事件之前的旧值;如果是语句级触发器,则不能在触发动作体中使用NEW或OLD进行引用。

如果触发动作体执行失败,激活触发器的事件(即对数据库的增删改操作)就会终止执行执行,触发器的目标或触发器可能影响的其他对象不发生任何变化。

2、激活触发器

触发器的执行是由触发事件激活,并由数据库服务器自动执行的。一个数据表上可能定义了多个触发器,如多个BEFORE触发器、多个AFTER 触发器等,同一个表上的多个触发器激活时遵循如下的执行顺序:
1. 执行该表上的BEFIRE触发器。
2. 激活触发器的SQL语句。
3. 执行该表上的AFTER触发器。

对于同一个表上的多个BEFORE(AFTER)触发器,遵循“谁先创建谁先执行”的原则,即按照触发器创建的时间先后顺序执行。有些关系数据库管理系统按照触发器名称的字母排序执行触发器。

3、删除触发器

SQL语句:DROP TRIGGER<触发器名>ON<表名>
触发器必须是一个已创建的,并且只能由相应权限的用户删除。

备注:触发器虽然功能强大,但是每次访问一个表都可能触发一个触发器,会导致系统性能降低,所以要谨慎使用。

猜你喜欢

转载自blog.csdn.net/lxw983520/article/details/80445639
今日推荐