关键字:
触发器
触发器概述
数据库触发器是一个已编译的存储程序单元,使用 PL/SQL编写,数据库在某些情况下会自动调用。每当发生下列操作之一时,触发器就会触发:
(1)、由任何用户在一个特定的表或视图上,发出 DML 语句。
(2)、DML 语句修改模式对象中的数据。例如,插入和删除行即是 DML 操作。
(3)、由任何用户或特定用户发出 DDL 语句。
(4)、DDL 语句定义模式对象。例如,创建表并添加一列即是 DDL 操作。
触发器是模式对象,类似于子程序;但其调用方法不同。子程序由用户、应用程序、或触发器显式运行。而触发器是在触发的事件发生时由数据库隐式调用的。
触发器优势
正确使用触发器使您能够更高效的使用数据库应用程序。您可以使用触发器执行以下任务:
(1)、自动生成派生列中的值
(2)、阻止无效事务
(3)、提供审计和事件日志记录
(4)、记录有关访问表的信息
您可以使用触发器强制执行对所有客户端应用程序都适用的底层业务规则。例如,几个应用程序都可能要访问orders表。如果此表上的某个触发器可以确保插入数据的格式,则不需要在每个客户端中重复这种业务逻辑。因为该触发器不能被应用程序绕过,触发器中的业务逻辑会被自动应用。
您可以使用触发器或完整性约束,来定义和执行任何类型的完整性规则。但是,当不能使用一个完整性约束来定义业务规则时,可以使用触发器来强制执行这种复杂的业务规则。但过度使用触发器,可能导致复杂的相互依赖关系,在一个大的应用程序中可能很难维护。当调用触发器时,在其触发器操作中的 SQL 语句可能会触发其他触发器,导致级联触发,可能会产生意想不到的结果。
3. 触发器类型
触发器可以根据其触发方式和他们所执行的操作类型进行分类。KingbaseES数据库支持以下类型的触发器:
(1)、行级触发器:行触发器在表每次受到触发语句影响时触发。如果触发语句未影响任何行,则行触发器不会运行。
(2)、语句级触发器:语句触发器针对触发语句只触发一次,无论触发语句影响多少行数。
(3)、INSTEAD OF 触发器:数据库会触发 INSTEAD OF 触发器,而不是执行触发语句。这些触发器可用于透明地修改不能直接通过 DML 语句修改的视图。
(4)、事件触发器:KingbaseES中的事件触发器对数据库来说是全局的,并且可以捕捉DDL事件。可以用任何事件触发器支持的过程语言编写事件触发。只要一个与事件触发器相关的事件在事件触发器所在的数据库中发生,该事件触发器就会被触发。
事件触发器可分为以下几类:
(1)、系统事件触发器可以由如数据库实例启动和关闭或错误消息之类的事件引起。
(2)、用户事件触发器会因为与用户登录和注销、DDL 语句、和 DML 语句等相关的事件而激发。
4. 触发时间
您可以定义触发时间来决定触发器操作是要在触发语句之前运行,还是之后运行。可以选择如下的触发时间:
(1)、触发语句之前
(2)、在受触发语句影响的每行之前
(3)、在受触发语句影响的每行之后
(4)、触发语句之后
对语句级和行级触发器,BEFORE 触发器可以增强安全性,并在对数据库进行更改之前启用业务规则。而 AFTER 触发器则对日志记录操作很有用。复杂触发器可以在多个时间点触发。复杂触发器提供一种编程方法,使你可以在多个不同的时间点,对共享的数据实施操作。
5. 触发器的创建
使用 CREATE TRIGGER 语句创建或替换数据库触发器。
PL/SQL 触发器有以下基本组件:
(1)、触发器名称:在相同的表中,触发器的名称必须是唯一的。
(2)、触发事件或语句:触发事件或语句是导致触发器被调用的 SQL 语句或用户事件
(3)、触发器时间:触发程序的动作时间,可以是BEFORE、AFTER 或 INSTEAD OF。
(4)、触发的操作:触发的操作是包含 SQL 语句和代码的过程,当发出一个触发语句、且触发器限制的计算结果为 true 时将被运行。
6. 触发器的内部执行
KingbaseES数据库在内部使用与执行子程序相同的步骤来执行触发器。唯一的细微区别在于,如果用户有权运行触发语句,则他有权触发该触发器。除了这个区别之外,数据库使用与存储子程序相同的方式来验证和运行触发器。
7. 触发器的存储
与 PL/SQL 存储过程类似,KingbaseES数据库将触发器以已编译形式存储在数据库模式中。当 CREATE TRIGGER 语句提交后,其编译后的 PL/SQL 代码被存储在数据库中,并重新加载到内存中。