首页 > 解决方案 > 通过 Powershell Start-Transcript 将时间戳添加到 Postgres PSQL 执行输出

问题描述

我搜索了论坛和网络,我没有找到任何符合我的问题的情况。

我需要根据 Powershell 执行的 PSQL 命令(postgres 行命令)的详细输出“采取行动”。

我能找到的最好的方法(非常感谢来自堆栈交换的人)是使用 Start-Transcript 注册详细信息,然后阅读日志并采取行动。问题是,我仍然需要检查是否有办法在“执行期间”采取行动,或者至少可以“测量”每个详细输出的时间。

非常不幸的是,我无法正确更改 pgsql 函数,我所拥有的只是详细的输出和已经实现的“通知”。

我尝试了“如何将时间戳添加到 PowerShell 和输出的各个行? ”建议的“过滤时间戳”解决方案,但由于某种原因,它没有按照我需要的方式生成时间戳。

我完全按照帖子示例进行了操作,您可以看到我非常简单的 powershell 命令是:

filter timestamp {"$(Get-Date -Format o): $_"}
cmd /c $DBCmd -f c:\di\mycmd.sql "postgresql://myuser:mypass@myhost/mydb" | timestamp

检查 Start-Transcript 生成的日志以及直接在命令行中的结果如下:

2018-07-30T16:30:32.6632687-03:00:              ?column?
2018-07-30T16:30:32.6632687-03:00: -----------------------------------
2018-07-30T16:30:32.6632687-03:00:  TIME2018-07-30 16:26:09.683957-03
2018-07-30T16:30:32.6632687-03:00: (1 row)
2018-07-30T16:30:32.6789028-03:00:
psql:c:/di/LOCK01.sql:2: NOTICE:  [LOG][Delete] [ADT_SPD_EFD_NFC_NECF_RDIA_ANALIT_ITEM]
psql:c:/di/LOCK01.sql:2: NOTICE:  [LOG][Delete] [ADT_SPD_EFD_NFC_NECF_NF]
psql:c:/di/LOCK01.sql:2: NOTICE:  [LOG][Delete] [ADT_SPD_EFD_NFC_NECF_RDIA_ANALIT]
psql:c:/di/LOCK01.sql:2: NOTICE:  [LOG][Delete] [ADT_SPD_EFD_NF_ITEM]
psql:c:/di/LOCK01.sql:2: NOTICE:  [LOG][Delete] [ADT_SPD_EFD_CFE_EQP_SAT]
psql:c:/di/LOCK01.sql:2: NOTICE:  [LOG][Delete] [ADT_SPD_EFD_NFC_ECF_CFE_CPL]
psql:c:/di/LOCK01.sql:2: NOTICE:  [LOG][Delete] [ADT_SPD_EFD_CFE]
psql:c:/di/LOCK01.sql:2: NOTICE:  [LOG][Delete] [ADT_SPD_EFD_NFC_NECF_NF_ITEM]
psql:c:/di/LOCK01.sql:2: NOTICE:  [LOG][Delete] [ADT_SPD_EFD_NF_CPL]
2018-07-30T16:30:37.2569238-03:00:  fn_adt_myfunction
2018-07-30T16:30:37.2588785-03:00: -----------------------------------------
2018-07-30T16:30:37.2598554-03:00:                                        1
2018-07-30T16:30:37.2608365-03:00: (1 row)
2018-07-30T16:30:37.2618073-03:00:

commad mycmd.sql 是 pgsql 函数的执行:

SELECT adt_objprog.fn_myfunction(myparams);

函数 myfunction 有简单的删除,如图:

v_cmd := 'DELETE FROM ADT_TDL.ADT_SPD_EFD_EGA_CV115_CDIA_ANALIT'||v_partionname||' WHERE COD_INT_ADT = '||v_cod_int_adt||' AND COD_INT_EFD IN (SELECT COD_INT_EFD FROM WORKDL_ADT.ADT_SPD_EFD_CHAVE_REMOCAO_1427_1);';
raise notice '[LOG][Delete] [ADT_SPD_EFD_EGA_CV115_CDIA_ANALIT]';
execute(v_cmd);
v_cmd := 'DELETE FROM ADT_TDL.ADT_SPD_EFD_EGA_CV115_CDIA'||v_partionname||' WHERE COD_INT_ADT = '||v_cod_int_adt||' AND COD_INT_EFD IN (SELECT COD_INT_EFD FROM WORKDL_ADT.ADT_SPD_EFD_CHAVE_REMOCAO_1427_1);';
raise notice '[LOG][Delete] [ADT_SPD_EFD_EGA_CV115_CDIA]';
execute(v_cmd);

正如您在示例中看到的那样,我真的不明白为什么没有为“通知”消息生成时间戳。

有没有人知道为什么会发生这种情况,以及是否有办法(任何方式)做到这一点?

非常感谢您,

此致,

路易斯

ps:我确实将标题更改为更好的标题(我认为),并进行了较小的更正。

标签: postgresqlpowershelltimestampoutputpsql

解决方案


推荐阅读