【问题标题】:how to create event trigger for create table or select into如何为创建表或选择创建事件触发器
【发布时间】:2017-10-09 08:12:49
【问题描述】:

我想为创建表或选择创建事件触发器, 例如: 创建表 xxxx 时,表名必须以 'temp' 变大

我的代码

    CREATE OR REPLACE FUNCTION create_table_func()
    RETURNS event_trigger
    AS
    $$
    DECLARE
          V_TABLE name := TG_TABLE_NAME;

BEGIN

    if V_TABLE !~ '^temp'

    then

      RAISE EXCEPTION 'must bigen with temp';

    end if;

END;
$$ LANGUAGE plpgsql SECURITY DEFINER;

CREATE EVENT TRIGGER create_table_1 ON ddl_command_start

WHEN TAG IN ('SELECT INTO')

EXECUTE PROCEDURE create_table_func();

但是当执行时 select * into test11 from test_bak

[Err] 错误:列“tg_table_name”不存在

【问题讨论】:

    标签: postgresql event-triggers


    【解决方案1】:

    这是我的代码,满足我的需要

    代码:

    CREATE OR REPLACE FUNCTION trg_create_table_func()
    RETURNS event_trigger
    LANGUAGE plpgsql
    AS $$
    DECLARE
        obj record;    
    BEGIN
      FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands() WHERE command_tag in ('SELECT INTO','CREATE TABLE','CREATE TABLE AS')
      LOOP
            if   obj.object_identity !~ 'public.temp_'  
            THEN
            raise EXCEPTION 'The table name must begin with temp_';
            end if;
            END LOOP;
    END;
    $$;
    
    CREATE EVENT TRIGGER trg_create_table ON ddl_command_end
    WHEN TAG IN ('SELECT INTO','CREATE TABLE','CREATE TABLE AS')
    EXECUTE PROCEDURE trg_create_table_func();
    

    输出记录

    [Err] 错误:表名必须以 temp_ 开头 上下文:PL/pgSQL 函数 trg_create_table_func() 第 10 行 RAISE

    很酷~

    【讨论】:

      【解决方案2】:

      特殊变量TG_TABLE_NAME仅在普通触发器中受支持,在事件触发器中不支持(并不总是有关联的表!)。

      文档中有一个list of functions,可以在事件触发器中返回上下文信息。

      您可以使用pg_event_trigger_ddl_commands() 来获取您需要的信息,但这仅适用于ddl_command_end 事件触发器。那应该对你有用;我看不出触发器不应在语句末尾运行的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-18
        • 1970-01-01
        • 2014-02-02
        • 2018-07-26
        • 2021-08-25
        • 2010-10-08
        • 1970-01-01
        相关资源
        最近更新 更多