如何为创建表或选择到中创建事件触发器

4
我可以为创建表或选择进入事件触发器创建翻译。例如:当创建表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时

[错误] 错误:列"tg_table_name"不存在

2个回答

6
这是我的代码,它满足了我的需求。
代码:
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();

外部记录

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

太棒了~


3
特殊变量TG_TABLE_NAME仅支持普通触发器,而不支持事件触发器(有时候没有关联的表!)。
文档中有一个函数列表,可以在事件触发器中返回上下文信息。
您可以使用pg_event_trigger_ddl_commands()来获取所需信息,但这仅适用于ddl_command_end事件触发器。对于您来说应该可行;我不认为触发器在语句结束时不会运行的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接