CREATE TRIGGER
功能描述
创建一个触发器。 触发器将与指定的表或视图关联,并在特定条件下执行指定的函数。
该文档只用于介绍
CREATE TRIGGER
语法在Oracle兼容模式下的表现,原Vastbase的CREATE TRIGGER
语法未做删除和修改,详见CREATE TRIGGER。
注意事项
以下功能仅在数据库兼容模式为Oracle时支持(即数据库实例初始化时指定DBCOMPATIBILITY='A')。
支持在全局临时表上创建触发器
功能描述
支持在全局临时表上使用CREATE TRIGGER创建触发器。
注意事项
Oracle兼容模式下,全局临时表上支持的触发器类型与普通表相同。
语法格式
CREATE TRIGGER name ... ON table_name| global_temporary_table ...
参数说明
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 ];
参数说明
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
支持在创建触发器时使用匿名块代替触发函数
功能描述
Vastbase在Oracle兼容模式下,创建触发器时支持使用PL/SQL(匿名块)来代替触发函数。使用匿名块可以更加方便地定义触发器逻辑,而无需单独创建触发器函数。
同时,Vastbase在Oracle兼容模式下实现了对触发器中:new
和:old
标识符的支持,该标识符用于引用触发器执行前后数据表中的新旧数据。
在创建触发器语法中会根据使用触发器的类型自动创建临时表:new
和:old
,临时表中的字段和当前所操作的表里面的字段保持一致。
临时表
:new
:做增加或更新操作时Oracle会自动创建该临时表,用来临时存放增加或更新后的数据。等增加数据确认后,再把该临时表中的数据插入到真正的表里面。增加或更新操作提交之后,临时表自动消失。临时表
:old
:做删除或更新操作时Oracle会自动创建该临时表,用来临时存放删除或更新前的数据。删除和更新操作提交之后,临时表自动消失。
示例
示例1: 在触发器中使用:new
标识符。
1、创建测试表并插入数据。
create table table_1188662(id int primary key,f2 varchar(10));
insert into table_1188662(id,f2) values(1,'abc');
2、创建序列。
create sequence seq_1188662 increment by 1 start with 2 maxvalue 9223372036854775807 minvalue 1 cache 1;
3、创建触发器。
create or replace trigger trigger_1188662
before insert on table_1188662
for each row
begin
select seq_1188662.nextval into :new.id from dual;
end;
/
4、插入数据并查询结果。
insert into table_1188662(id,f2) values(10000000,'abc');
select * from table_1188662;
返回结果为:
id | f2
----+-----
1 | abc
2 | abc
(2 rows)
示例2: 创建触发器结合子查询。
1、创建3个测试表并插入数据。
create table tab(id int,col1 int,col2 int,col3 int );
insert into tab values(1,1,2,3);
create table tab_1(id int , id2 int, col2 varchar(100));
insert into tab_1 values(1,2,'abc');
insert into tab_1 values(44,3,'abc');
create table audit(id int , col1 int, col2 int,col3 int);
2、创建触发器,这个触发器在向tab表插入新行之前被触发。
这个触发器的声明部分,它从tab_1表中查询了与id2为2的行相关的id,并将这些值分别赋给了new.id、old.col1、new.col2和old.col3,然后,它将这些值插入到audit表中。
create or replace trigger trigger_1188878
before insert on tab
for each row
DECLARE
v_id NUMBER;
v_col1 int;
v_col2 int;
v_col3 int;
begin
SELECT c.id INTO :new.id
FROM tab c
WHERE c.id = (SELECT o.id FROM tab_1 o WHERE o.id2 = 2);
SELECT c.id INTO :old.col1
FROM tab c
WHERE c.id = (SELECT o.id FROM tab_1 o WHERE o.id2 = 2);
SELECT c.id INTO new.col2
FROM tab c
WHERE c.id = (SELECT o.id FROM tab_1 o WHERE o.id2 = 2);
SELECT c.id INTO old.col3
FROM tab c
WHERE c.id = (SELECT o.id FROM tab_1 o WHERE o.id2 = 2);
SELECT :new.id,:old.col1,new.col2,old.col3
INTO v_id, v_col1, v_col2, v_col3
FROM dual;
insert into audit values( v_id, v_col1, v_col2, v_col3);
end;
/
3、插入数据并查询结果。
insert into tab(id) values(0);
select * from audit;
返回结果为:
id | col1 | col2 | col3
----+------+------+------
1 | 1 | 1 | 1
(1 row)