我想为create table创建事件触发器或select into, 例如: 当create table xxxx必须用'temp'
表名bigen时我的代码
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
中选择* into test11[错误]错误:列“tg_table_name”不存在
答案 0 :(得分:2)
这是我的代码,它符合我的需求
代码:
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();
out recods
[错误]错误:表名必须以temp_开头 上下文:PL / pgSQL函数trg_create_table_func()第10行在RAISE
很酷〜
答案 1 :(得分:1)
特殊变量TG_TABLE_NAME
仅在普通触发器中受支持,而不在事件触发器中受支持(并不总是有关联的表!)。
文档中有一个list of functions,可以在事件触发器中返回上下文信息。
您可以使用pg_event_trigger_ddl_commands()
获取所需信息,但这仅适用于ddl_command_end
个事件触发器。这对你有用;我没有看到触发器不应该在语句结束时运行的原因。