我需要在postgresql中创建一个审计表,类似于描述here。但是,PostgreSQL本身并不知道进行更改的实际用户 - 相反,我的应用程序维护一个连接池(使用psycopg2的python),并且各个用户登录到应用程序,而不是PostgreSQL。如何让PostgreSQL了解用户从我的应用程序进行更改?或者我只需要将所有审计代码放在应用程序端?
答案 0 :(得分:0)
我设法使用临时表解决了这个问题。我最终做的是以下内容。请注意,这是使用python和psycopg2编写的。
首先,我设置我的python代码以使用with
构造从psycopg2连接池获取数据库游标。无论代码块如何退出,这都具有自动将连接返回到池的附加好处。然后,我修改了with
构造中使用的类,以便在返回游标之前创建一个包含我认为有用的数据的临时表,特别是用户名。此表是使用ON COMMIT DROP选项创建的,因此我知道当我将连接返回到池时,表将被删除,从而防止与将来使用连接发生冲突。
然后我写了我的ON UPDATE触发器来从这个临时表中提取用户名。由于触发器在psycopg2用于运行我的SQL语句的同一事务中触发,因此它可以看到临时表并从中选择所需的用户名。为了处理触发触发器时临时表可能不存在的可能性(例如,如果我直接在数据库上进行更改),我将SELECT语句包装在异常处理块的触发器中。如果尝试查询临时表时出错,则会返回使用current_user
的值。
使用此设置,我不仅可以将应用程序用户名,而且还可以将我想要的任何其他客户端/应用程序端信息(例如客户端IP地址)传递到数据库,从而使我能够记录否则不会可以访问PostgreSQL。