从 postgres 日志中获取可执行查询

Posted

技术标签:

【中文标题】从 postgres 日志中获取可执行查询【英文标题】:Get executable query from postgres log 【发布时间】:2017-08-11 07:54:57 【问题描述】:

我在 PostgreSQL 版本 9.2 中激活了 SQL 语句的日志记录。 它开始写这样的日志语句:

日志:执行:更新 qrz_TRIGGERS SET JOB_NAME = $1, JOB_GROUP = $2,IS_VOLATILE = $3,DESCRIPTION = $4,NEXT_FIRE_TIME = $5,PREV_FIRE_TIME = $6,TRIGGER_STATE = $7,TRIGGER_TYPE = $8, START_TIME = $9, END_TIME = $10, CALENDAR_NAME = $11, MISFIRE_INSTR = $12, PRIORITY = $13 其中 TRIGGER_NAME = $14 并且 TRIGGER_GROUP = 15 美元

详细信息:参数:$1 = 'dssSchedulerJob', $2 = 'DEFAULT', $3 = 'f', $4 > = NULL, $5 = '1501855865730', $6 = '1501855855730', $7 = '阻塞',$ 8 ='简单',$ 9 ='1252939835730',$ 10 ='0',$ 11 = NULL,$12 = '0',$13 = '5',$14 = 'dssTrigger',$15 = 'DEFAULT'

我想使用这个 SQL 并在 pgAdmin3 中运行分析。

有人知道如何让 Postgres 区分整数和字符串吗?或者在需要引号和不需要引号的参数之间更好。

取参数放到SQL中的正确位置是很麻烦的。此外,在这里编写一个简单的工具来提供帮助是不可能或非常困难的,因为它不知道是否需要引号。

谢谢。

【问题讨论】:

【参考方案1】:

你可以看到除了 null 之外的所有值都用单引号括起来。您可以将它们传递给准备好的语句,因为它们在此处提供。一个简短的例子:

t=# prepare a(int) as (select $1/2);
PREPARE
t=# execute a('4');
 ?column?
----------
        2
(1 row)

t=# execute a('32');
 ?column?
----------
       16
(1 row)

因此您可以使用 LOG: execute 部分来准备语句并解析 DETAIL: parameters: 以用作语句的参数

【讨论】:

这意味着我可以使用带引号的值,不管它们是字符串还是 int 值? 整数作为文本到整数的“默认转换”,因此它不允许 '99a' 作为整数传递,但 '99' 将允许。

以上是关于从 postgres 日志中获取可执行查询的主要内容,如果未能解决你的问题,请参考以下文章

我如何将Postgres DDL转储到可粘贴到Google表格中的CSV中?

是否有任何 jar 可用于在 java 中更快地执行 sql 查询? [关闭]

MFC: 获取可执行文件目录 + 写日志函数

在不执行查询的情况下获取 Postgres 查询结果的类型

Linux下获取可执行程序的绝对路径

Mono 分析器“在主可执行文件中找不到‘日志’分析器,也无法从‘mono-profiler-log’加载。”