【数据库】通过触发器实现审计日志记录-应用篇

摘要:
PostgreSQL触发器,日志审计小工具最近遇到了一个项目问题。审核日志记录不够详细。例如,用户编辑了设备,只记录了设备名称、操作时间、登录用户和用户操作的登录IP。在编辑设备的其他属性之前和之后的信息之间没有更详细的比较。审计粒度不够细致,显然不能让客户满意,坚持客户满意优先的原则,我们不得不提供一波技术支持。

PostgreSQL触发器,日志审计小神器

 

最近遇到的项目问题,审计日志记录不够详细,比如某用户编辑了某台设备,只记录了用户操作的设备名、操作时间、登录用户和登录IP,至于设备其他属性编辑前和编辑后的信息就没有更详细的对比了,审计粒度不够细,显然是不能让客户满意的,秉承客户满意优先原则,只好技术加持一波了。

 

实际客户想要记录的更多,涉及的业务属性比较广,返本溯源,我们决定在数据库层面解决,以期能最少的改动业务代码。

利用PostgreSql触发器在源表数据发生变化的时候准备一张对应表进行备份记录,把变化数据就像提交svn一样插入到历史表中,如图

 【数据库】通过触发器实现审计日志记录-应用篇第1张

解决方案有了,但其实还存在一个问题触发器只在数据库内部运行,如何记录是当前是哪个登录用户对数据源进行的变更还是个问题,经过一位大佬的指导,可以利用PostgreSql的会话变量解决,简单的测试代码如下

 【数据库】通过触发器实现审计日志记录-应用篇第2张

打印结果

 【数据库】通过触发器实现审计日志记录-应用篇第3张

这样就可以利用数据库会话变量的特性,在每一次的数据库变更前,先将全局操作pid关联到用户uid为一张表,而变更的时候,将将全局操作pid插入到历史数据表中,这样通过唯一的全局操作pid就可以关联查询出是哪个用户的操作了。

于是解决方案图变为

 【数据库】通过触发器实现审计日志记录-应用篇第4张

开心的代码实现

创建审计主表

 【数据库】通过触发器实现审计日志记录-应用篇第5张

创建审计历史表

 【数据库】通过触发器实现审计日志记录-应用篇第6张

创建用户id和操作id关联表

 【数据库】通过触发器实现审计日志记录-应用篇第7张

在用户进行数据操作变更的postgresql连接时,我们都先将数据库全局变量插入到operation_log表中,将当前登录的用户id与这次变更操作绑定在一起,这个可以封装在web框架层实现。

创建触发器

触发器函数定义了触发器被触发后执行的操作,下面列一下触发器函数中可以使用的变量,例子中的OLD,就表示触发操作的旧数据行,详细如下:

NEW:INSERTUPDATE 操作触发的行级触发器中存储的新的数据行,

OLD:INSERTUPDATE 操作触发的行级触发器中存储的的数据行,

TG_OP:代表当前触发器监听到的操作类型,数据类型为 text,内容为 INSERTUPDATEDELETETRUNCATE

 【数据库】通过触发器实现审计日志记录-应用篇第8张

小结

本文只是大概如何利用PostgreSql触发器对用户行为进行详细日志审计,旨在提供一个触发器记录数据源变更和web框架结合的思路,希望对你有所帮助,如果你有更好的解决方案可以留言告诉我哦

PS:如果文章对你有价值,欢迎点个推荐。

免责声明:文章转载自《【数据库】通过触发器实现审计日志记录-应用篇》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SHELL脚本编程循环篇-while循环[UE4]RichTextBlock下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mysql中的data下的数据文件(.FRM、.MYD、.MYI)恢复为数据

记一次mysql中的data文件操作经历 想拿到一个项目的最新的数据,做功能升级使用,备份一份数据同时也作为本地测试数据,文件有些大,我直接通过远程的phpmyadmin程序导出,不能愉快的玩耍,直接联系了IDC的同事帮忙导一份sql文件出来一下,结果那哥们没得直接扔给了我data文件,这让我如何是好,这个问题我没遇见过啊。处于面子问题,又不好意思再让他重...

ASP.NET Web Game 构架设计2数据库设计

ASP.NETWebGame构架设计2--数据库设计   前一篇Blog对WebGame服务器的物理结构做了一个简要说明,下面我们对各个组成元素进行详细说明。            首先来看一下数据库设计。            游戏的数据库设计是项目基础设计中很重要的一个环节,下面将说明以下几个要点: u  为什么选用SqlServer u  基本原则...

Mysql双机热备实现数据库高可用

mysql双主热备,也称主主互备,目的是mysql数据库高可用,只支持双机,原因是mysql的复制是一主多从,但一个从服务器只能有一个主服务器。 双机热备的条件是双机mysql版本必须一致。 服务器分别为A(172.16.9.212)、B(172.16.9.213),配置步骤如下: 一、A->B主从备份 1、在主服务器A上创建从服务器备份的用户,IP...

Sharding-jdbc 读写分离(三)- springboot+mybatis+Hikari

概念 在上一篇文章介绍了如何使用Sharing-JDBC实现数据库的分表分库。这章节将介绍读写分离,读写分离的好处就是在并发量比较大的情况下,将查询数据库的压力 分担到多个从库中,能够满足高并发的要求。比如上一篇实现的那样,架构图如下: 代码 sharding.jdbc.datasource.names=db0,db1 # 数据源db0 sharding...

PbootCMS网站无缝转PBMOD

下载文件(群文件也可下载):       只适用于PbootCMS-V3.1.2转为PBMOD-V1.0.9.beta2,数据库必须是MySql   使用说明: 1、先备份原网站的程序和数据库,这是最基本的。 2、将PBOMD程序源码全部覆盖原网站。注意:保留原网站的模板文件夹! 3、修改数据库配置文件,configdatabase.php,填写原来的数...

MySQL-添加索引或字段时如何不锁表

索引的添加MySQL经历了一下几个历程: 一 .在MySQL 5.5版本之前,添加索引具体是这样的: 1.首先创建一张临时表和原表数据结构相同,将你要添加的索引加上。 2.把原表数据导入临时表。 3.删除原表。 4.将临时表重命名为原表。 这样做有很大问题: 首先对于大数据量的导入需要很长的时间,那么在这段时间里新增或修改的数据没办法处理。 其次如果碰上大...