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

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

 

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

 

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

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

 

 

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

 

 

 

 

打印结果svn

 

 

 

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

因而解决方案图变为post

 

 

 

开心的代码实现测试

 

建立审计主表ui

 

 

 

 

 

建立审计历史表spa

 

 

 

 

 

 

建立用户id和操做id关联表

 

 

 

 

在用户进行数据操做变动的postgresql链接时,咱们都先将数据库全局变量插入到operation_log表中,将当前登陆的用户id与此次变动操做绑定在一块儿,这个能够封装在web框架层实现。

 

 

建立触发器

 

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

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

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

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

 

 

 

 

小结

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

 

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

相关文章
相关标签/搜索