如何解决PG DDL事件触发器无法正常工作
我试图通过Postgresql中的事件触发器来拦截CREATE TABLE,以禁止创建不符合某些命名规则的表。我的代码如下:
CREATE OR REPLACE FUNCTION e_ddl_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 ('CREATE TABLE')
LOOP
if NOT obj.object_identity LIKE 't?_%' ESCAPE '?'
THEN
raise EXCEPTION 'The table name must begin with t_';
end if;
END LOOP;
END;
$$;
CREATE EVENT TRIGGER trg_create_table ON ddl_command_end
WHEN TAG IN ('CREATE TABLE')
EXECUTE PROCEDURE e_ddl_create_table_func();
当我尝试:
CREATE TABLE t_toto3 (i INT)
我系统地出现以下错误:
错误:表名必须以t_
开头 内容:功能PL / pgsql e_ddl_create_table_func(),ligne 11àRAISE
我想念什么?
解决方法
每the docs,printString
是模式限定的。在您的示例中它将以object_identity
的形式出现(除非您使用其他默认架构进行了非常非标准的设置);您可以通过将表格组件传递给parse_ident()并提取第二项来获得表格组件。 (请注意最后parse_ident()周围的多余parens,以便正确解析数组查找。)
'public.t_toto3'
,
是的,它可以与parse_ident一起使用。解决方法是:
CREATE OR REPLACE FUNCTION e_ddl_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 ('CREATE TABLE')
LOOP
if NOT (parse_ident(obj.object_identity))[2] LIKE 't?_%' ESCAPE '?'
THEN
raise EXCEPTION 'The table name must begin with t_';
end if;
END LOOP;
END;
$$;
CREATE EVENT TRIGGER trg_create_table ON ddl_command_end
WHEN TAG IN ('CREATE TABLE')
EXECUTE PROCEDURE e_ddl_create_table_func();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。