PL/SQL

PL/SQL 知识量:16 - 57 - 244

13.2 触发器的创建和使用><

触发器的语法- 13.2.1 -

PL/SQL中的触发器的语法如下:

CREATE [OR REPLACE] TRIGGER trigger_name  
{BEFORE | AFTER | INSTEAD OF} event_name  
ON table_name  
[FOR EACH ROW]  
DECLARE  
  -- 声明变量  
BEGIN  
  -- 触发器代码  
EXCEPTION  
  -- 异常处理代码  
END;

其中,关键字和部分的说明如下:

  • CREATE [OR REPLACE] TRIGGER trigger_name:创建触发器,并指定触发器的名称。OR REPLACE选项表示如果触发器已经存在,则替换原有的触发器。

  • BEFORE | AFTER | INSTEAD OF event_name:指定触发器的事件类型,可以是BEFORE(在事件之前触发)、AFTER(在事件之后触发)或INSTEAD OF(替代事件触发)。事件类型包括INSERT、UPDATE和DELETE等。

  • ON table_name:指定触发器所依赖的表名。

  • [FOR EACH ROW]:可选项,表示触发器是否为每行触发。如果没有指定,则表示触发器为语句级触发器,只在事件发生时触发一次。

  • DECLARE:声明部分,用于定义变量和常量。

  • BEGIN和END:PL/SQL代码块的起始和结束标记。

  • EXCEPTION:可选项,用于处理触发器代码中的异常。

创建DML触发器- 13.2.2 -

DML触发器是指当数据库服务器中发生DML事件(如SELECT、UPDATE、INSERT和DELETE语句)时,会自动触发并执行一系列操作的一种存储过程。

DML触发器的作用包括:

  • 记录并审核用户对表中数据的修改操作,实现审计功能;

  • 实现比CHECK约束更加复杂的完整性约束,比如禁止非业务时间的数据操作;

  • 实现某种业务逻辑,比如在增加或删除员工时,自动更新部门中的人数;

  • 根据需要生成序列号的值,为字段提供默认的数据;

  • 实现数据的同步复制等。

DML触发器的缺点包括:

  • 增加了数据库结构的复杂度和系统维护的难度;

  • 触发器由数据库服务器运行,会占用更多的数据库资源;

  • 不同数据库之间的可移植性比较差;

  • 不能接收参数,只能基于当前的触发对象进行操作。

以下是一个示例,创建一个AFTER INSERT触发器,在表employees上的每行插入后记录日志:

CREATE OR REPLACE TRIGGER log_inserts_after  
AFTER INSERT ON employees  
FOR EACH ROW  
DECLARE  
  v_log_table table_name.log_column%TYPE;  
BEGIN  
  v_log_table := 'employees';  
  INSERT INTO log_table (log_table, log_action, log_timestamp, log_user)  
  VALUES (v_log_table, 'INSERT', SYSDATE, USER);  
END;

替代类型触发器- 13.2.3 -

在PL/SQL中,替代类型触发器(INSTEAD OF Trigger)用于在用户对表执行特定操作(如INSERT、UPDATE或DELETE)时拦截该操作,并在触发器中执行自定义的代码逻辑。

替代类型触发器的特点是,它们不是在表上直接执行的,而是在表上定义的视图上执行的。这意味着当用户对表执行操作时,实际上是在视图上执行操作,而替代类型触发器会拦截该操作并在触发器中执行自定义代码。

替代类型触发器通常用于以下几种情况:

  1. 视图上的操作:当用户对视图执行操作时,替代类型触发器可以拦截该操作并在触发器中执行自定义代码。这允许在视图上执行更复杂的操作,例如根据特定条件过滤数据或转换数据格式。

  2. 表上的约束:替代类型触发器可以用于在表上实现更复杂的约束条件,例如检查多个列的组合是否满足特定规则。在触发器中,可以编写自定义的代码逻辑来验证数据并阻止不符合约束条件的操作。

  3. 表上的业务逻辑:替代类型触发器可以在表上执行特定的业务逻辑,例如根据用户角色限制对某些列的修改,或在执行操作时自动触发其他操作。

注意:替代类型触发器只能在视图上定义,并且只能用于拦截对视图的操作。

复合类型触发器- 13.2.4 -

复合类型触发器(Compound Trigger)允许在单个触发器中定义多个事件类型的操作。

复合类型触发器的主要特点是,它可以在单个触发器中定义多个事件类型的操作,例如INSERT、UPDATE和DELETE等。这意味着在触发器中,可以根据需要在不同的时间点执行不同的操作。

复合类型触发器通常用于以下情况:

  • 需要在多个事件类型上执行相同的操作:复合类型触发器可以定义在多个事件类型上执行相同的操作,例如在INSERT和UPDATE事件上执行相同的代码逻辑。

  • 需要在多个事件类型上执行不同的操作:复合类型触发器可以定义在多个事件类型上执行不同的操作,例如在INSERT事件上执行一些代码逻辑,而在UPDATE事件上执行另一些代码逻辑。

复合类型触发器的语法通常如下:

CREATE [OR REPLACE] TRIGGER trigger_name  
{BEFORE | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE} ON table_name  
[FOR EACH ROW]  
DECLARE  
  -- 声明变量  
BEGIN  
  -- 触发器代码  
EXCEPTION  
  -- 异常处理代码  
END;

在复合类型触发器中,可以在BEFORE、AFTER或INSTEAD OF部分指定多个事件类型,例如BEFORE INSERT OR UPDATE。然后,在触发器的代码中,可以根据事件类型执行相应的操作。

DDL类型触发器- 13.2.5 -

DDL(数据定义语言)类型触发器用于在数据库对象(如表、视图、索引等)上执行DDL操作时自动触发执行一些自定义的代码逻辑。

DDL类型触发器的主要特点是,它们可以拦截DDL操作并在触发器中执行自定义的代码逻辑。这使得可以在数据库对象上执行特定的操作,例如记录日志、验证数据完整性或执行其他自定义的业务逻辑。

DDL类型触发器通常用于以下情况:

  • 记录DDL操作日志:可以使用DDL类型触发器来记录对数据库对象执行的DDL操作,以便进行审计和跟踪。

  • 验证数据完整性:可以在DDL类型触发器中编写自定义的代码逻辑,以验证在执行DDL操作后数据是否保持完整性。

  • 触发其他操作:可以在DDL类型触发器中编写自定义的代码逻辑,以在执行DDL操作时触发其他操作,例如发送通知或更新其他相关对象。

DDL类型触发器的语法通常如下:

CREATE [OR REPLACE] TRIGGER trigger_name  
{BEFORE | AFTER} {CREATE | ALTER | DROP} ON {table_name | view_name | index_name}  
DECLARE  
  -- 声明变量  
BEGIN  
  -- 触发器代码  
EXCEPTION  
  -- 异常处理代码  
END;

在DDL类型触发器中,需要在BEFORE或AFTER部分指定要拦截的DDL操作类型,例如BEFORE CREATE或AFTER ALTER。然后,在触发器的代码中,可以编写自定义的逻辑以执行所需的操作。