【问题标题】:Get created table name获取创建的表名
【发布时间】:2016-10-08 20:15:16
【问题描述】:

我正在尝试创建一个event trigger,每当创建时执行。 发生这种情况时,我想将创建的表的名称插入到表中(其中有 2 列 idtablename )。阅读文档我无法找到如何获取表名。

到目前为止,我有这个:

CREATE OR REPLACE FUNCTION insert_layer()
RETURNS event_trigger
AS $$
    DECLARE r RECORD;
    BEGIN
            RAISE NOTICE 'event for % ', tg_tag;
            -- I would like to execute this
            --EXECUTE format('INSERT INTO "public.Layers"(name) VALUES(' || tableNameHere || ')') INTO result;
    END;
$$
LANGUAGE plpgsql;

CREATE EVENT TRIGGER insert_layer_event ON ddl_command_start 
WHEN TAG IN ('CREATE TABLE')
EXECUTE PROCEDURE insert_layer();

【问题讨论】:

  • 对于ddl_command_end 上的触发器,您可以使用pg_event_trigger_ddl_commands functionRAISE INFO 'Table: %', (pg_event_trigger_ddl_commands()).object_identity;
  • 非常感谢!!如果你写一个答案,我会接受! =)

标签: database postgresql event-triggers


【解决方案1】:

为了能够检索一些附加信息,请使用on ddl_command_end 触发器而不是on ddl_command_start。在调用此类触发器的函数中,您可以使用pg_event_trigger_ddl_commands function

CREATE OR REPLACE FUNCTION insert_layer()
RETURNS event_trigger
AS $$
    DECLARE r RECORD;
    BEGIN
            RAISE NOTICE 'event for % ', tg_tag;
            -- I would like to execute this
            r := pg_event_trigger_ddl_commands(); 
            INSERT INTO public."Layers"(name) VALUES(r.object_identity);
    END;
$$
LANGUAGE plpgsql;

注意代码改动:

1) 你不需要使用EXECUTE
2)"public.Layers" 是指当前模式中名称恰好为"public.Layers" 的表,而不是模式public 中的表Layers

【讨论】:

    猜你喜欢
    • 2018-04-05
    • 2019-01-20
    • 2013-06-08
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多