首页 > 其他分享 >openGauss学习笔记-43 openGauss 高级数据管理-事件触发器

openGauss学习笔记-43 openGauss 高级数据管理-事件触发器

时间:2023-08-18 18:33:32浏览次数:32  
标签:触发器 43 trigger command 事件 openGauss event

openGauss学习笔记-43 openGauss 高级数据管理-事件触发器

触发器会在指定的ddl事件发生时自动执行函数。目前事件触发器仅在PG兼容模式下可用。

43.1 语法格式

  • 创建事件触发器。

    CREATE EVENT TRIGGER name
        ON event
        [ WHEN filter_variable IN (filter_value [, ... ]) [ AND ... ] ]
        EXECUTE PROCEDURE function_name()
    
  • 修改事件触发器。

    ALTER EVENT TRIGGER name DISABLE
    ALTER EVENT TRIGGER name ENABLE [ REPLICA | ALWAYS ]
    ALTER EVENT TRIGGER name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
    ALTER EVENT TRIGGER name RENAME TO new_name
    
  • 删除事件触发器。

    DROP EVENT TRIGGER [ IF EXISTS ] name [ CASCADE | RESTRICT ];
    

43.2 参数说明

  • name

    事件触发器名称。

  • filter_variable

    事件触发器用来做过滤的变量(目前仅支持TAG)。

  • event

    事件触发器支持的事件,目前支持ddl_command_start、ddl_command_end、sql_drop、table_rewrite。

  • function_name

    用户定义的函数,必须声明为不带参数并返回类型为event_trigger,在事件触发器触发时执行。

  • new_name

    修改后的新事件触发器名称。

  • disable

    禁用该事件触发器。

  • ENABLE [ REPLICA | ALWAYS ]

    该事件触发器在session_replication_role为REPLICA任何取值时可用。

43.3 示例

--创建事件触发器函数(用于ddl_command_start、ddl_command_end事件)
openGauss=# create function test_event_trigger() returns event_trigger as $$
BEGIN
    RAISE NOTICE 'test_event_trigger: % %', tg_event, tg_tag;
END
$$ language plpgsql;

--创建事件触发器函数(用于sql_drop事件)
openGauss=# CREATE OR REPLACE FUNCTION drop_sql_command()
RETURNS event_trigger AS $$
BEGIN
RAISE NOTICE '% - sql_drop', tg_tag;
END;
$$ LANGUAGE plpgsql;

--创建事件触发器函数(用于table_rewrite事件)
openGauss=# CREATE OR REPLACE FUNCTION test_evtrig_no_rewrite() RETURNS event_trigger
LANGUAGE plpgsql AS $$
BEGIN
  RAISE EXCEPTION 'rewrites not allowed';
END;
$$;

--创建事件类型为ddl_command_start的事件触发器
openGauss=# create event trigger regress_event_trigger on ddl_command_start
   execute procedure test_event_trigger();

--创建事件类型为ddl_command_end的事件触发器
openGauss=# create event trigger regress_event_trigger_end on ddl_command_end
   execute procedure test_event_trigger();

--创建事件类型为sql_drop的事件触发器
openGauss=# CREATE EVENT TRIGGER sql_drop_command ON sql_drop
    EXECUTE PROCEDURE drop_sql_command();

--创建事件类型为table_rewrite的事件触发器
openGauss=# create event trigger no_rewrite_allowed on table_rewrite
  when tag in ('alter table') execute procedure test_evtrig_no_rewrite();

--执行ddl语句查看事件触发器效果(触发ddl_command_start与ddl_command_end)
openGauss=# create table event_trigger_table (a int);

--执行alter table语句查看事件触发器效果(触发ddl_command_start与table_rewrite,ddl_command_end由于禁止rewrite报错不触发)
openGauss=# alter table event_trigger_table alter column a type numeric;

--执行drop语句查看事件触发器效果(触发ddl_command_start、sql_drop与ddl_command_end)
openGauss=# drop table event_trigger_table;

--修改事件触发器
openGauss=# create role regress_evt_user WITH ENCRYPTED PASSWORD 'EvtUser123';
openGauss=# ALTER EVENT TRIGGER regress_event_trigger RENAME TO regress_event_trigger_start;
--应该失败,事件触发器的owner只能为超级用户
openGauss=# ALTER EVENT TRIGGER regress_event_trigger_start owner to regress_evt_user;
openGauss=# ALTER EVENT TRIGGER regress_event_trigger_start disable;
openGauss=# ALTER EVENT TRIGGER regress_event_trigger_start enable always;

--删除事件触发器
openGauss=# DROP EVENT TRIGGER regress_event_trigger_start;
openGauss=# DROP EVENT TRIGGER regress_event_trigger_end;
openGauss=# DROP EVENT TRIGGER sql_drop_command;
openGauss=# DROP EVENT TRIGGER no_rewrite_allowed;

标签:触发器,43,trigger,command,事件,openGauss,event
From: https://blog.51cto.com/shuchaoyang/7140308

相关文章

  • Gym-103438C Werewolves
    Gym-103438CWerewolves题面有\(n(1\len\le3000)\)个节点的树,每个节点的颜色为\(c_i\)。请计算这个树存在多少不同的连通子图,满足这个连通子图中,存在某种颜色,其出现次数严格大于连通子图中节点数量的一半。简化题意first对于任意一个联通子图,如果该联通子图对答......
  • 【安全学习之路】Day43
    ......
  • UVA1435 Business Cards 题解
    题目链接思路一道找规律思维题,代码非常简单。能否把\(c\timesd\)的矩阵分成若干个\(a\timesb\)的矩阵,其实就是问你\(a\)或\(b\)中有没有\(c\)或\(d\)的因数。只要存在一组,即可分割成题目所要求的矩阵,输出YES;反之,输出NO。注意:其实每个测试点都有多组数据,但题......
  • MySQL-进阶篇 ( 视图 + 存储过程 + 触发器 )
    MySQL-进阶篇(视图/存储过程/触发器)目录MySQL-进阶篇(视图/存储过程/触发器)视图/存储过程/触发器视图介绍视图大体语法视图的检查选项CASCADED和LOCAL视图的更新作用案例存储过程介绍特点语法变量系统变量用户定义变量局部变量if语句参数case语句三种循......
  • openGauss学习笔记-42 openGauss 高级数据管理-触发器
    openGauss学习笔记-42openGauss高级数据管理-触发器触发器会在指定的数据库事件发生时自动执行函数。42.1语法格式创建触发器CREATETRIGGERtrigger_name{BEFORE|AFTER|INSTEADOF}{event[OR...]}ONtable_name[FOR[EACH]{ROW|STATEMENT......
  • LeetCode 1143.最长公共子序列
    1.题目:给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,"......
  • orcale触发器
    这是一个Oracle数据库触发器,用于在WHDTL表上进行INSERT或UPDATE操作之前执行特定的逻辑。触发器中的逻辑会在每次插入或更新WHDTL表的行之前触发。触发器的主要目的是在将新数据插入到WHDTL表之前,根据一些条件从其他表中检索相关的数据,并根据需要执行插入操作,以确保关联的数据的......
  • 8-17|2023-08-16 12:33:55,972 [salt.master :1643][ERROR ][20321] Received
    该日志条目显示了来自于Saltminion(在这里标识为`[master]`,这可能是minion的名称或者是由于其他原因导致的日志格式)的错误,表示minion在执行一个函数时发生了异常。日志内容“`Theminionfunctioncausedanexception`”表示在minion端执行的特定Salt函数引发了一个错误或异常。......
  • PPT| 《图解CIO工作指南(第4版)》-读书笔记P143
    PPT共143页,由于篇幅有限,以下为部分资料.......
  • openGauss学习笔记-40 openGauss 高级数据管理-锁
    openGauss学习笔记-40openGauss高级数据管理-锁如果需要保持数据库数据的一致性,可以使用LOCKTABLE来阻止其他用户修改表。例如,一个应用需要保证表中的数据在事务的运行过程中不被修改。为实现这个目的,则可以对表使用进行锁定。这样将防止数据不被并发修改。LOCKTABLE只在一......