VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

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