PostgreSQL触发器使用(实现建表时表名必须统一)

17 10月
作者:PK|分类:工作

        业务特殊需要,有几个PG数据库大家可以建立自己的数据表,但面临一个问题,这些临时表不需要每天备份,这样就要求表名采用固定的格式,这样在PG备份的时候可以用 -T 参数过滤掉,这个需求立马想到了利用PG自带的触发器实现,简单粗暴直接上代码:

--建立触发器函数
CREATE OR REPLACE FUNCTION trg_create_table_func()
RETURNS event_trigger
LANGUAGE plpgsql
AS $$
DECLARE
	obj record;
	sms_role text := (select rolsuper::text from pg_roles where rolname =CURRENT_ROLE);
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_' and sms_role ='false'
		THEN
		raise EXCEPTION 'SQL只读账号建表必须以temp_开头,PLS tell:181-1xxx-xxxx';
		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();

--其中TAG支持的方法可以参考官方帮助文档
https://www.postgresql.org/docs/9.6/static/event-trigger-matrix.html


浏览990 评论0
返回
目录
返回
首页
感触颇多 Postgresql利用触发器对表进行审计