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();

但是当从 test_bak 执行 select * into test11

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

4

2 回答 2

5

这是我的代码,它满足我的需求

代码:

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_ 开头 CONTEXT:PL/pgSQL function trg_create_table_func() line 10 at RAISE

很酷~

于 2017-10-10T05:38:02.930 回答
3

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

该文档有一个函数列表,可以在事件触发器中返回上下文信息。

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

于 2017-10-09T08:58:50.873 回答