每个用户日志设置
来自 PostgreSQL 维基
跳转到导航跳转到搜索我们可以在每个用户的基础上设置 log_statement 吗?
例如
ALTER USER [user] SET log_statement TO [none|ddl|mod|all];
目标是覆盖 postgresql.conf 中的全局设置;例如,我们需要记录一组用户的全部活动,但不能记录其他用户的活动,并且不想让我们的日志变得过大。
与一些开发人员的讨论和文档暗示我们可以这样做
- http://postgresql.1045698.n5.nabble.com/per-user-logging-td1848980.html
- https://postgresql.ac.cn/docs/9.0/interactive/sql-alteruser.html
- https://postgresql.ac.cn/docs/9.0/interactive/sql-alterrole.html
- https://postgresql.ac.cn/docs/9.0/interactive/sql-set.html
不幸的是,我们无法让它工作。以下是测试概述。
所以
- 这是否是一个错误,因为它应该被允许,但没有被允许?
- 或者,这是预期的行为,因为它是一个“会话”设置,并不影响设置已更改的非特权用户(因为这不是该用户的会话)?
- 或者,这是标签完成中的错误?(如果这是不允许的,最好给出错误。)
- 或者文档不完整?
- 或者我们只是做错了?
其他问题
- 如果这有效,我们如何找出哪个用户具有哪个设置?
- 还有其他*可以*工作的设置吗?
初始测试
以下是我作为非特权用户运行的 SQL
-- this should appear under 'ddl' level CREATE TABLE testy (id serial primary key, name text); -- this should only appear under 'mod' level INSERT INTO testy (name) VALUES ('gabrielle'), ('selena'), ('dan'); -- this should only appear under 'all' level SELECT * FROM testy; -- this should only appear under 'mod' level DROP TABLE testy;
测试 1
log_statement = 'mod' #in postgresql.conf
postgres=# ALTER USER gabrielle SET log_statement TO 'ddl'; LOG: statement: ALTER USER gabrielle SET log_statement TO 'ddl'; ALTER ROLE
这让我相信我成功设置了此参数。
但是,用户的 ddl 和 mod 语句被记录了;我期望只有 ddl 语句被记录。将用户的 log_statement 设置为 none 和 all 的结果相同。
测试 2
log_statement = 'all' #in postgresql.conf
这一次,所有用户的语句都被记录了,无论用户的 log_statement 设置为什么。换句话说,与之前的结果相同。
根据 Rob Treat 的要求,其他需要检查的事情:
gabrielle=> ALTER USER gabrielle SET log_statement TO 'mod'; ERROR: permission denied to set parameter "log_statement"
所以,用户不能为自己更改它。但是,标签完成暗示这是一个选项。:)