CREATE TRIGGER
功能描述
创建一个触发器。 触发器将与指定的表或视图关联,并在特定条件下执行指定的函数。
本文档仅介绍CREATE TRIGGER语法兼容Oracle的特性。
注意事项
以下功能仅在数据库兼容模式为Oracle时支持(即数据库实例初始化时指定DBCOMPATIBILITY='A')。
支持在全局临时表上创建触发器
功能描述
支持在全局临时表上使用CREATE TRIGGER创建触发器。
注意事项
Oracle兼容模式下,全局临时表上支持的触发器类型与普通表相同。
语法格式
CREATE TRIGGER name ... ON table_name| global_temporary_table ...
完整语法及参数含义详见《开发者指南》中的SQL语法:CREATE TRIGGER。
参数说明
name
触发器名称,该名称不能限定模式,因为触发器自动继承其所在表的模式,且同一个表的触发器不能重名。 对于约束触发器,使用SET CONSTRAINTS修改触发器行为时也使用此名称。
取值范围:符合标识符命名规范的字符串,且最大长度不超过63个字符。
table_name
需要创建触发器的表名称。
取值范围:数据库中已经存在的表名称。
global_temporary_table
需要创建触发器的全局临时表名。包括会话级临时表(ON COMMIT PRESERVE ROWS)和事务级临时表(ON COMMIT DELETE ROWS)。
示例
1、创建全局临时表。
create global temp table old_1132410(id int,c1 char(8));
create global temp table tab_1132410(id int,c1 int);
2、在old表上创建DML触发器。
--创建insert触发器,触发后向tab表插入数据
create or replace trigger tri1_1132410
after insert on old_1132410
for each statement
begin
insert into tab_1132410 values(1,1),(2,2),(3,3);
end;
/
--创建update触发器,触发后为tab表更新数据
create or replace trigger tri2_1132410
after update on old_1132410
for each statement
begin
update tab_1132410 set c1=4 where id=2;
end;
/
--创建truncate触发器,触发后向tab表插入数据
create or replace trigger tri4_1132410
after truncate on old_1132410
for each statement
begin
insert into tab_1132410 values(4,4);
end;
/
3、查看原始测试表数据。
select * from old_1132410;
select * from tab_1132410;
返回结果依次如下,初始状态下表中无数据:
id | c1
----+----
(0 rows)
id | c1
----+----
(0 rows)
4、对old表执行DML操作,触发器将更新tab表中的记录。
--insert触发
insert into old_1132410 values(1,'a'),(2,'b');
--update触发
update old_1132410 set c1='b' where id=1;
--truncate触发
truncate table old_1132410;
5、查看测试表数据。
select * from old_1132410;
select * from tab_1132410 order by id;
返回结果依次如下,old表中的数据被truncate清空,tab表中插入了正确的数据。
id | c1
----+----
(0 rows)
id | c1
----+----
1 | 1
2 | 4
3 | 3
4 | 4
(4 rows)
创建触发器的语句中包含触发器执行的PL/pgSQL块
功能描述
支持在创建触发器的语句中包含触发器执行的PL/pgSQL块。即允许DML触发器或边界触发器直接使用一条语句创建触发器,而不需要提前创建触发器函数或过程。
语法格式
CREATE TRIGGER trigger_name ... ON table_name | global_temporary_table ...
BEGIN
statements
END [ trigger_name ];
完整语法及参数含义详见《开发者指南》中的SQL语法:CREATE TRIGGER。
参数说明
trigger_name
触发器名称。
取值范围:符合标识符命名规范的字符串,且最大长度不超过63个字符。
table_name | global_temporary_table
需要创建触发器的普通表或全局临时表的名称。
statements
PL/pgSQL块的语句部分。可以包含创建触发器的语句。
示例
1、创建测试表。
create table employees(id int,salary int);
2、插入测试数据。
insert into employees values(1,6000);
3、创建DML触发器。
create or replace trigger t
before insert or update of salary,id
or delete on employees
begin
case
when inserting then
dbms_output.put_line('inserting');
when updating ('salary') then
dbms_output.put_line('updating salary');
when updating ('id') then
dbms_output.put_line('updating id');
when deleting then
dbms_output.put_line('deleting');
end case;
end;
/
4、设置serveroutput 为on(允许将dbms_output.put_line的输出信息输出至vsql的命令界面的屏幕上)。
set serveroutput on;
5、insert触发。
insert into employees values(2,7000);
返回结果为:
inserting
INSERT 0 1
6、update触发。
update employees set salary= salary+1000 where id=1;
返回结果为:
updating salary
UPDATE 1
7、delete触发。
delete employees where id=2;
返回结果为:
deleting
DELETE 1