微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgresql表数据监控设计

1.创建logging模式,并且创建一个logging模式下的记录表:

CREATESCHEMAlogging;
CREATETABLElogging.user_history(
idserial,tstamptimestampDEFAULTNow(),schemanametext,tabnametext,operationtext,whotextDEFAULTcurrent_user,new_valjson,old_valjson
);

2.创建触发器函数:

CREATEFUNCTIONchange_user_trigger()
RETURNStriggerAS$$
BEGIN
IFTG_OP='INSERT'THEN
INSERTINTOlogging.user_history(tabname,schemaname,operation,new_val)values(TG_RELNAME,TG_TABLE_SCHEMA,TG_OP,row_to_json(NEW));
RETURNNEW;
ELSIFTG_OP='UPDATE'THEN
INSERTINTOlogging.user_history(tabname,new_val,old_val)values(TG_RELNAME,row_to_json(NEW),row_to_json(OLD));
RETURNNEW;
ELSIFTG_OP='DELETE'THEN
INSERTINTOlogging.user_history(tabname,row_to_json(OLD));
	RETURNOLD;--返回值要与ELSIF平齐,因为先插入后最好才执行返回
	ENDIF;
END;
$$LANGUAGE'plpgsql'SecurityDEFINER;--securitydefiner是指定创建该函数用户的权限执行,securityinvoker是指以调用函数用户发权限执行

3.创建测试表users:

CREATETAbleusers
(
idserialNOTNULL,usernamecharactervarying(40),emailcharactervarying(100)
)

4.创建触发器:

CREATETRIGGER"logging_user_change"
BEFOREINSERTORUPDATEORDELETE
ONusers
FOREACHROW
EXECUTEPROCEDUREchange_user_trigger();

5.测试:

INSERTINTOusersVALUES('hans','hans@qq.com');
UPDATEuseRSSETid=1,username='paul';

这个函数的缺陷:

1,它不能监控select语句

2,它不能监控系统表

3,它不能监控DDL操作,例如alter table(如果需要监控可以配置postgresql.conf文件,修改log_statment参数:#log_statement = 'none' # none,ddl,mod,all)

原文地址:https://www.jb51.cc/postgresql/195303.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐