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

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

原创 田灬禾 2021-12-18
461

今天学习openGauss的触发器,引用下官方描述:触发器将与指定的表或视图关联,并在特定条件下执行指定的函数。

这点与oracle不同,openGauss是触发执行函数。

https://opengauss.org/zh/docs/2.1.0/docs/Developerguide/CREATE-TRIGGER.html

注意事项

  • 当前仅支持在普通行存表上创建触发器,不支持在列存表、临时表、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


学习笔记:

  1.     查看触发器视图:PG_TRIGGER
  2.     查看某张表相关视图:\dS+ 表名
  3.     禁用触发器:ALTER TABLE 表名 DISABLE TRIGGER ALL;--禁用表所有触发器。 ALTER TABLE 表名 DISABLE TRIGGER 触发器名; --禁用某个触发器
  4.     删除触发器:DROP TRIGGER 触发器 ON 表名;


课程作业

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

omm=# create table t_src(id int,name char(30));
CREATE TABLE
omm=# create table t_des(id int,name char(30));
CREATE TABLE
omm=# CREATE OR REPLACE FUNCTION tri_func() RETURNS TRIGGER AS
omm-# $$
omm$# DECLARE
BEGIN
omm$# omm$# INSERT INTO t_des VALUES(NEW.id, NEW.name);
omm$# RETURN NEW;
omm$# END
omm$# $$ LANGUAGE PLPGSQL;
CREATE FUNCTION
omm=# 
omm=# CREATE TRIGGER insert_trigger
omm-# omm-# BEFORE INSERT ON t_src
omm-# FOR EACH ROW
EXECUTE PROCEDURE tri_func();
CREATE TRIGGER
omm=# 


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

omm=# insert into t_src values (1,'a');
INSERT 0 1
omm=# select * from t_des;
 id |              name              
----+--------------------------------
  1 | a                             
(1 row)

omm=# alter table t_src disable trigger insert_trigger;
ALTER TABLE
omm=# insert into t_src values (,'a');2,'');b');
INSERT 0 1
omm=# select * from t_des;
 id |              name              
----+--------------------------------
  1 | a                             
(1 row)

omm=# select * from t_src;
 id |              name              
----+--------------------------------
  1 | a                             
  2 | b                             
(2 rows)

omm=# 


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

omm=# select * from pg_trigger ;
 tgrelid |     tgname     | tgfoid | tgtype | tgenabled | tgisinternal | tgc
onstrrelid | tgconstrindid | tgconstraint | tgdeferrable | tginitdeferred | 
tgnargs | tgattr | tgargs | tgqual | tgowner 
---------+----------------+--------+--------+-----------+--------------+----
-----------+---------------+--------------+--------------+----------------+-
--------+--------+--------+--------+---------
   16389 | insert_trigger |  16395 |      7 | D         | f            |    
         0 |             0 |            0 | f            | f              | 
      0 |        | \x     |        |      10
(1 row)
omm=# \dS t_src;
        Table "public.t_src"
 Column |     Type      | Modifiers 
--------+---------------+-----------
 id     | integer       | 
 name   | character(30) | 
Disabled triggers:
    insert_trigger BEFORE INSERT ON t_src FOR EACH ROW EXECUTE PROCEDURE tri_func()


4.重命名触发器

omm=# alter trigger insert_trigger on t_src rename to instri;


5.删除触发器

omm=# drop trigger instri on t_src;
DROP TRIGGER
omm=# 




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

评论