如何创建用于创建 table 或 select 的事件触发器
how to create event trigger for create table or select into
我想为创建 table 或 select 创建事件触发器,
例如:
当创建 table xxxx 时必须 table 将 bigen 命名为 '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 * 从 test_bak
进入 test11
[Err] 错误:列 "tg_table_name" 不存在
特殊变量 TG_TABLE_NAME
仅在普通触发器中受支持,在事件触发器中不受支持(并不总是有关联的 table!)。
文档中有一个 list of functions 可以 return 事件触发器中的上下文信息。
您可以使用 pg_event_trigger_ddl_commands()
来获取您需要的信息,但这只适用于 ddl_command_end
事件触发器。那应该对你有用;我看不出为什么触发器不应该在语句末尾 运行 的原因。
这是我的代码,满足我的需求
代码:
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] 错误:table 名称必须以 temp_ 开头
上下文:PL/pgSQL 函数 trg_create_table_func() 第 10 行在 RAISE
很酷~
我想为创建 table 或 select 创建事件触发器, 例如: 当创建 table xxxx 时必须 table 将 bigen 命名为 '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 * 从 test_bak
进入 test11[Err] 错误:列 "tg_table_name" 不存在
特殊变量 TG_TABLE_NAME
仅在普通触发器中受支持,在事件触发器中不受支持(并不总是有关联的 table!)。
文档中有一个 list of functions 可以 return 事件触发器中的上下文信息。
您可以使用 pg_event_trigger_ddl_commands()
来获取您需要的信息,但这只适用于 ddl_command_end
事件触发器。那应该对你有用;我看不出为什么触发器不应该在语句末尾 运行 的原因。
这是我的代码,满足我的需求
代码:
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] 错误:table 名称必须以 temp_ 开头 上下文:PL/pgSQL 函数 trg_create_table_func() 第 10 行在 RAISE
很酷~