暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

openGauss每日一练第18天 | openGauss触发器

原创 lxs_data 2021-12-18
589

 TRIGGER

 触发器将与指定的表或视图关联,并在特定条件下执行指定的函数。

注意事项
   当前仅支持在普通行存表上创建触发器,不支持在列存表、临时表、unlogged表等类型表上创建触发器。
   如果为同一事件定义了多个相同类型的触发器,则按触发器的名称字母顺序触发它们。
  触发器常用于多表间数据关联同步场景,对SQL执行性能影响较大,不建议在大数据量同步及对性能要求高的场景中使用。

官网语法格式:

CREATE [ CONSTRAINT ] TRIGGER trigger_name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] }
    ON table_name
    [ FROM referenced_table_name ]
    { NOT DEFERRABLE | [ DEFERRABLE ] { INITIALLY IMMEDIATE | INITIALLY DEFERRED } }
    [ FOR [ EACH ] { ROW | STATEMENT } ]
    [ WHEN ( condition ) ]
    EXECUTE PROCEDURE function_name ( arguments );

其中event包含以下几种:

    INSERT
   UPDATE [ OF column_name [, ... ] ]
   DELETE
   TRUNCATE

openGauss触发器 操作练习

创建源表和触发表,在源表上创建insert触发器,创建操作触发表的触发器函数

创建源表和触发表

omm=# CREATE TABLE tb_src(id1 INT, id2 INT, id3 INT);
CREATE TABLE
omm=# CREATE TABLE tb_des(id1 INT, id2 INT, id3 INT);
CREATE TABLE

创建触发器函数

omm=# CREATE OR REPLACE FUNCTION insert_func() RETURNS TRIGGER AS
omm-# $$
omm$# DECLARE
omm$# BEGIN
omm$# INSERT INTO tb_des VALUES(NEW.id1, NEW.id2, NEW.id3);
omm$# RETURN NEW;
omm$# END
omm$# $$ LANGUAGE PLPGSQL;
CREATE FUNCTION

在源表上创建insert触发器

omm=#
omm=# CREATE TRIGGER insert_trigger
omm-# FOR EACH ROW
omm-# BEFORE INSERT ON tb_src
omm-# EXECUTE PROCEDURE insert_func();
CREATE TRIGGER


在源表上执行insert操作,查看触发操作是否生效;禁用触发器后,再次查看触发操作是否生效

在源表上执行insert操作,查看触发操作是否生效

omm=# INSERT INTO tb_src VALUES(100,200,300);
INSERT 0 1
omm=# SELECT * FROM tb_src;
id1 | id2 | id3
-----+-----+-----
100 | 200 | 300
(1 row)

omm=# SELECT * FROM tb_des;
id1 | id2 | id3
-----+-----+-----
100 | 200 | 300
(1 row)

查看触发器是生效的

禁用触发器后,再次查看触发操作是否生效

omm=#
omm=# ALTER TABLE tb_src DISABLE TRIGGER insert_trigger;
ALTER TABLE
omm=# INSERT INTO tb_src VALUES(100,200,300);
INSERT 0 1
omm=# SELECT * FROM tb_src;
id1 | id2 | id3
-----+-----+-----
100 | 200 | 300
100 | 200 | 300
(2 rows)

omm=# SELECT * FROM tb_des;
id1 | id2 | id3
-----+-----+-----
100 | 200 | 300
(1 row)

禁用之后可以看出触发器不生效了。

使用系统表PG_TRIGGER和\dS+查看触发器

使用系统表PG_TRIGGER查看触发器

omm=# select * from PG_TRIGGER;
tgrelid | tgname | tgfoid | tgtype | tgenabled | tgisinternal | tgconstrrelid | tgc
onstrindid | tgconstraint | tgdeferrable | tginitdeferred | tgnargs | tgattr | tgargs | tgqu
al | tgowner
---------+----------------+--------+--------+-----------+--------------+---------------+----
-----------+--------------+--------------+----------------+---------+--------+--------+-----
---+---------
16408 | insert_trigger | 16414 | 7 | D | f | 0 |
0 | 0 | f | f | 0 | | \x |
| 10
16420 | insert_trigger | 16426 | 7 | D | f | 0 |
0 | 0 | f | f | 0 | | \x |
| 10
(2 rows)

使用\dS+查看触发器

omm=# \dS+ tb_src;
Table "public.tb_src"
Column | Type | Modifiers | Storage | Stats target | Description
--------+---------+-----------+---------+--------------+-------------
id1 | integer | | plain | |
id2 | integer | | plain | |
id3 | integer | | plain | |
Disabled triggers:
insert_trigger BEFORE INSERT ON tb_src FOR EACH ROW EXECUTE PROCEDURE insert_func()
Has OIDs: no
Options: orientation=row, compression=no

重命名触发器

omm=# ALTER TRIGGER insert_trigger ON tb_src RENAME TO insert_trigger_new;
ALTER TRIGGER

omm=# select * from PG_TRIGGER;
tgrelid | tgname | tgfoid | tgtype | tgenabled | tgisinternal | tgconstrrelid |
tgconstrindid | tgconstraint | tgdeferrable | tginitdeferred | tgnargs | tgattr | tgargs |
tgqual | tgowner
---------+--------------------+--------+--------+-----------+--------------+---------------+
---------------+--------------+--------------+----------------+---------+--------+--------+-
-------+---------
16408 | insert_trigger | 16414 | 7 | D | f | 0 |
0 | 0 | f | f | 0 | | \x |
| 10
16420 | insert_trigger_new | 16426 | 7 | D | f | 0 |
0 | 0 | f | f | 0 | | \x |
| 10
(2 rows)

omm=# \dS+ tb_src;
--------+---------+-----------+---------+--------------+-------------
id1 | integer | | plain | |
id2 | integer | | plain | |
id3 | integer | | plain | |
Disabled triggers:
insert_trigger_new BEFORE INSERT ON tb_src FOR EACH ROW EXECUTE PROCEDURE insert_func()
Has OIDs: no
Options: orientation=row, compression=no

Table "public.tb_src"
Column | Type | Modifiers | Storage | Stats target | Description 


删除触发器

omm=# DROP TRIGGER insert_trigger_new ON tb_src;
DROP TRIGGER

ALTER TRIGGER

修改触发器定义。

只有触发器所在表的所有者可以执行ALTER TRIGGER操作,系统管理员默认拥有此权限。

语法


ALTER TRIGGER trigger_name ON table_name RENAME TO new_name;

DROP TRIGGER

删除触发器。

只有触发器的所有者可以执行DROP TRIGGER操作,系统管理员默认拥有此权限。

语法

DROP TRIGGER [ IF EXISTS ] trigger_name ON table_name [ CASCADE | RESTRICT ];








「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论