CREATE TRIGGER 语句 (PL/SQL)
CREATE TRIGGER 语句在数据库中定义 PL/SQL 触发器。
语法
>>-CREATE--+------------+--TRIGGER--trigger-name----------------> '-OR REPLACE-' >--+-BEFORE-----+--| 触发器事件 |--ON--table-name--------------------> +-AFTER------+ '-INSTEAD OF-' >--+---------------------------------------------+--------------> | .----------------------------. | | V (1) .-AS-. | | '-REFERENCING----------+-OLD--+----+--相关名-+-+-' | .-AS-. | '-NEW--+----+--相关名-' >--+-FOR EACH ROW-------+--+------------------+-----------------> '-FOR EACH STATEMENT-' '-WHEN--(--搜索条件--)-' .-----------. V | >--+--------------------------+--BEGIN----statement-+-----------> | .-------------. | | V | | '-DECLARE----declaration-+-' .-------------------------------------------------------------------------. V | >----+---------------------------------------------------------------------+-+--> | .-------------------. .-------------------. | | V | V | | '-EXCEPTION--WHEN----condition--+----+-+--THEN----handler-statement-+-' '-OR-' >--END--------------------------------------------------------->< 触发器事件 .-OR--------------------------------------. V (2) | |----+-INSERT--------------------------+-----+------------------| +-DELETE--------------------------+ '-UPDATE--+---------------------+-' | .-,-----------. | | V | | '-OF----column-name-+-'
注:
- OLD 和 NEW 只能指定一次。
- 不能对同一操作多次指定触发器事件。例如,允许使用 INSERT OR DELETE,但不允许使用 INSERT OR INSERT。
描述
- OR REPLACE
- 指定如果当前服务器上已存在触发器定义,那么替换该定义。在目录中替换新定义之前,将有效地删除现有定义。如果当前服务器上不存在触发器定义,那么将忽略此选项。
- trigger-name
- 指定触发器的名称。此名称(包括隐式或显式的模式名)不能标识已在目录中描述的触发器 (SQLSTATE 42710)。如果指定了两部分的名称,那么模式名不能以“SYS”开头 (SQLSTATE 42939)。
- BEFORE
- 指定在将主题表的实际更新所引起的任何更改应用于数据库之前执行相关联的触发操作。
- AFTER
- 指定在将主题表的实际更新所引起的更改应用于数据库之后执行相关联的触发操作。
- INSTEAD OF
- 指定由相关联的触发操作替换对主题视图的操作。
- 触发器事件
- 指定每当对主题表应用其中一个事件时都要执行与触发器相关联的触发操作。可指定这些事件的任意组合,但每个事件(INSERT、DELETE
和 UPDATE)只能指定一次 (SQLSTATE 42613)。
- INSERT
- 指定每当对主题表执行 INSERT 操作时执行与此触发器相关联的触发操作。
- DELETE
- 指定每当对主题表执行 DELETE 操作时执行与此触发器相关联的触发操作。
- UPDATE
- 指定每当对主题表中指定的列或暗指的列执行 UPDATE 操作时执行与此触发器相关联的触发操作。
如果未指定可选的 列名 列表,那么暗指该表的每一列。因此,省略 列名 列表意味着,更新该表的任何列都将激活触发器。
- OF column-name,...
- 指定的每个 column-name 都必须是基本表的列 (SQLSTATE 42703)。如果此触发器是 BEFORE 触发器,那么指定的 列名 不能是除标识列以外的生成列 (SQLSTATE 42989)。列名 不能在 列名 列表中多次出现 (SQLSTATE 42711)。仅当更新 列名 列表中标识的列时,才将激活此触发器。不能对 INSTEAD OF 触发器指定此子句 (SQLSTATE 42613)。
- ON table-name
- 指定 BEFORE 触发器或 AFTER 触发器定义的主题表。此名称必须指定基本表或者解析为基本表的别名(SQLSTATE 42704 或 42809)。此名称不能指定目录表 (SQLSTATE 42832)、具体化查询表 (SQLSTATE 42997)、已创建临时表、已声明临时表 (SQLSTATE 42995) 或昵称 (SQLSTATE 42809)。
- REFERENCING
- 指定转换变量的相关名。相关名标识触发 SQL 操作所影响的行集中的特定行。通过使用 相关名(如下指定)对列进行限定,触发操作可以对触发 SQL 操作所影响的每一行进行处理。
- OLD AS correlation-name
- 指定一个相关名,此名称标识触发 SQL 操作之前的行状态。如果触发器事件为 INSERT,那么行中的值为空值。
- NEW AS correlation-name
- 指定一个相关名,此名称标识由触发 SQL 操作以及已执行的 BEFORE 触发器中的任何 SET 语句修改的行状态。如果触发器事件为 DELETE,那么行中的值为空值。
- FOR EACH ROW
- 指定对触发 SQL 操作所影响的主题表中的每一行执行一次触发操作。
- FOR EACH STATEMENT
- 指定对整个语句仅应用触发操作一次。
- WHEN
-
- (搜索条件)
- 指定具有 true 或 false 值或者未知值的条件。搜索条件 使您能够确定是否应该执行特定的触发操作。仅当指定的搜索条件求值为 true 时,才会执行相关联的操作。
- declaration
- 指定变量声明。
- 语句 或 处理语句
- 指定 PL/SQL 程序语句。触发器主体可以包含嵌套的块。
- 条件
- 指定异常条件名,例如 NO_DATA_FOUND。
示例
以下示例显示行级别的前触发器,对于每个隶属于部门
30 的新职员,在将该职员的记录插入到 EMP 表之前,此触发器会计算该职员的佣金。它还记录异常表中任何增幅超出
50% 的薪水增长情况:
CREATE TABLE emp (
name VARCHAR2(10),
deptno NUMBER,
sal NUMBER,
comm NUMBER
)
/
CREATE TABLE exception (
name VARCHAR2(10),
old_sal NUMBER,
new_sal NUMBER
)
/
CREATE OR REPLACE TRIGGER emp_comm_trig
BEFORE INSERT OR UPDATE ON emp
FOR EACH ROW
BEGIN
IF (:NEW.deptno = 30 and INSERTING) THEN
:NEW.comm := :NEW.sal * .4;
END IF;
IF (UPDATING and (:NEW.sal - :OLD.sal) > :OLD.sal * .5) THEN
INSERT INTO exception VALUES (:NEW.name, :OLD.sal, :NEW.sal);
END IF; END /
