菜合馍*_*合馍馍 4 postgresql event-triggers
我想为创建表或选择创建事件触发器,例如:当创建表 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();
Run Code Online (Sandbox Code Playgroud)
但是当从 test_bak 执行 select * into test11 时
[Err] 错误:列“tg_table_name”不存在
这是我的代码,它满足我的需求
代码:
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();
Run Code Online (Sandbox Code Playgroud)
出记录
[Err] 错误:表名必须以 temp_ CONTEXT 开头:PL/pgSQL 函数 trg_create_table_func() line 10 at RAISE
很酷~