如何获取来自PostgreSQL驱动/RDS API的RDS用户访问历史及表访问情况
追踪RDS PostgreSQL实例中特定表的访问用户
一、RDS API层面的访问追踪
你提到的CloudTrail确实是追踪RDS API调用的核心方式,补充几个关键筛选点:
- 在CloudTrail事件中筛选事件源为
rds.amazonaws.com,如果是通过RDS Data API执行表操作,对应的事件名称是ExecuteStatement,可以从userIdentity字段获取调用的IAM用户/角色。 - 对于通过AWS官方API直接操作表数据或结构的行为,CloudTrail会完整记录调用者身份,重点查看
userIdentity下的arn或userName字段即可。
二、PostgreSQL驱动(客户端)的用户访问追踪
这部分需要借助PostgreSQL本身的功能和RDS的日志体系,以下是几种实用方法:
1. 开启数据库日志记录
修改RDS实例关联的参数组,调整以下参数:
log_statement:设置为all(记录所有SQL语句)、mod(仅记录数据修改语句)或ddl(仅记录结构变更),根据需求选择;log_connections:设为on,记录所有新连接的用户;log_disconnections:设为on,记录连接断开的用户。
日志会同步到CloudWatch Logs,在对应的日志组中搜索包含目标表名的日志条目,日志里会显示user=[你的PostgreSQL用户名],直接对应驱动端的访问用户。注意:如果业务量较大,建议临时开启或配合log_min_duration_statement(设置为非0值,仅记录执行时间超过该值的语句)来控制日志量。
2. 实时查看活跃会话
使用PostgreSQL内置的pg_stat_activity视图,实时查询当前正在访问目标表的用户:
SELECT usename AS postgres_user, query AS executed_sql, client_addr AS client_ip FROM pg_stat_activity WHERE query LIKE '%your_target_table%' AND state = 'active';
这个方法只能获取当前活跃的访问会话,无法追溯历史操作。
3. 自定义触发器追踪表访问
如果需要精准记录特定表的所有读写操作(包括历史记录),可以创建触发器和日志表:
-- 1. 创建存储访问记录的日志表 CREATE TABLE table_access_log ( log_id SERIAL PRIMARY KEY, accessed_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, accessing_user TEXT NOT NULL, operation_type TEXT NOT NULL, -- 记录INSERT/UPDATE/DELETE等操作 target_table TEXT NOT NULL ); -- 2. 创建触发器函数 CREATE OR REPLACE FUNCTION log_table_access() RETURNS TRIGGER AS $$ BEGIN INSERT INTO table_access_log (accessing_user, operation_type, target_table) VALUES (current_user, TG_OP, TG_TABLE_NAME); RETURN NULL; END; $$ LANGUAGE plpgsql; -- 3. 给目标表绑定触发器(覆盖INSERT/UPDATE/DELETE操作) CREATE TRIGGER track_target_table_access AFTER INSERT OR UPDATE OR DELETE ON your_target_table FOR EACH ROW EXECUTE FUNCTION log_table_access();
之后查询table_access_log表,就能看到所有访问该表的PostgreSQL用户、操作类型和时间。
4. 利用RDS Performance Insights
如果你的RDS实例开启了Performance Insights,可以在控制台中:
- 切换到"Top SQL"标签,搜索包含目标表名的SQL语句;
- 查看对应的"User"维度,即可找到执行这些语句的PostgreSQL用户。
内容的提问来源于stack exchange,提问作者7uper
相关产品推荐
相关产品推荐

