能,但需审计已启用、路径正确且日志未被轮转清理;sql server仅支持.sqlaudit和azure blob日志,不支持default trace。

SQL Server 的 sys.fn_get_audit_file 能直接读审计日志吗?
能,但前提是审计功能已启用且日志路径可访问。很多人查不到数据,不是函数用错,而是根本没开服务器审计或日志被自动轮转清理了。
- 必须先确认审计对象存在:
SELECT * FROM sys.server_audits,状态为STARTED -
sys.fn_get_audit_file只支持 Windows 审计文件(.sqlaudit)和 Azure SQL 的 Blob 日志,不支持 SQL Server 自带的default trace - 路径参数要写全,比如
N'C:\audits\*.sqlaudit',漏掉通配符*或反斜杠会返回空结果 - 如果审计日志启用了
MAX_ROLLOVER_FILES且设得小(如 5),旧文件可能已被覆盖,查不到历史调用
PostgreSQL 怎么捕获存储过程执行记录?
PG 没有原生存储过程审计开关,靠 log_statement + log_line_prefix 配合日志解析是最可行的路。别指望 pg_stat_statements 记录所有调用——它只统计执行计划,不存时间戳、用户、参数值。
- 把
log_statement = 'all'改成'mod'更合理:只记录含 DML/DDL 的函数调用(比如CALL、DO、SELECT func()),避免日志爆炸 - 在
postgresql.conf中加log_line_prefix = '%t [%u@%d] %a ',确保每行含时间、用户、数据库、应用名,方便后续 grep 或导入 ELK - 注意:
log_statement = 'all'会记录每个SELECT,包括函数内部的查询,噪音极大;而'mod'至少能过滤掉纯查询类函数 - 函数若用
SECURITY DEFINER,日志里显示的是定义者而非调用者,需额外在函数开头用CURRENT_USER打点日志
MySQL 存储过程调用没进 general_log?
开了 general_log 却看不到 CALL proc_name(),大概率是日志格式问题或权限限制。MySQL 的 general_log 记录的是客户端发来的原始语句,不是服务端展开后的逻辑。
- 确认
general_log = ON且general_log_file路径可写,用SHOW VARIABLES LIKE 'general_log%';检查 - 如果用的是
TABLE格式(log_output = 'TABLE'),查mysql.general_log表时记得加WHERE argument LIKE 'CALL%',别只看command_type = 'Query' -
general_log默认不记录存储过程内部语句,只记顶层CALL;若想追踪内部逻辑,得在过程里手动INSERT INTO audit_log ... - 高并发下
general_log严重拖慢性能,上线环境慎用;临时排查可用,但别长期开着
审计日志里怎么区分“谁在什么时候调用了哪个存储过程”?
关键不在日志有没有,而在字段是否足够还原上下文。很多团队日志里只有时间+语句,缺用户、主机、事务ID,导致无法关联业务请求。
- SQL Server 审计日志中,
server_principal_name是调用者,database_name和object_name可定位到具体过程,但statement字段不包含参数值——需结合additional_information解析 XML(如果有) - PostgreSQL 日志里,
%u是用户,%h是客户端 IP,%p是进程 ID,配合应用层传入的X-Request-ID(写进application_name)才能串起链路 - MySQL 的
general_log不记录客户端 IP,除非开启log_slow_extra并配合slow_query_log,但后者只记慢查询——所以真正可靠的方案还是在存储过程开头写自定义日志表
最常被忽略的一点:所有审计日志都默认不存参数内容,而业务追责往往卡在“他传了什么值”。真要完整追溯,得在过程里做显式记录,别依赖通用日志机制。










