0

我需要在 postgresql 中创建一个审计表,类似于此处描述的内容。但是,进行更改的实际用户并不是 PostgreSQL 本身知道的——相反,我的应用程序维护一个连接池(python 使用 psycopg2),并且单个用户登录到应用程序,而不是 PostgreSQL。如何让 PostgreSQL 知道哪个用户正在对我的应用程序进行更改?还是我只需要把所有的审计代码应用程序端?

4

1 回答 1

0

我设法使用临时表解决了这个问题。我最终做的是以下。请注意,这是使用 python 和 psycopg2 编写的。

首先,我设置了我的 python 代码以使用该with构造从 psycopg2 连接池获取数据库游标。这有一个额外的好处,即自动将连接返回到池中,而不管代码块如何退出。然后我修改了with构造中使用的类以创建一个临时表,其中包含我认为有用的任何数据,特别是用户名,然后返回游标。该表是使用 ON COMMIT DROP 选项创建的,因此我知道当我将连接返回到池时,该表将被删除,以防止与将来使用该连接发生任何冲突。

然后我编写了我的 ON UPDATE 触发器来从这个临时表中提取用户名。由于触发器从与 psycopg2 用于运行我的 SQL 语句的同一事务中触发,因此它可以查看临时表并从中选择所需的用户名。为了处理触发触发器时临时表可能不存在的可能性(例如,如果我直接在数据库上进行更改),我将 SELECT 语句包装在触发器中的异常处理块中。如果在尝试查询临时表时出错,它会current_user转而使用 of 的值。

使用此设置,我不仅可以将应用程序用户名,还可以将我想要的任何其他客户端/应用程序端信息(例如客户端 IP 地址)传递给数据库,从而使我能够记录否则 PostgreSQL 无法访问的值.

于 2013-09-12T19:06:54.597 回答