我搜索了论坛和网络,但没有找到与我的问题相符的情况。
我需要根据Powershell执行的PSQL命令(postgres行命令)的详细输出来“执行操作”。
我能找到的最好的方法(非常感谢堆栈交换人员)是使用Start-Transcript注册详细信息,然后阅读日志并采取措施。问题是,我仍然需要检查是否有一种方法可以在执行过程中采取措施,或者至少至少来“度量”每个详细输出的时间。
很不幸,我不能正确地更改pgsql函数,我所拥有的只是详细的输出和已经实现的“通知”。
我尝试了“ How do I add timestamps to individual lines of PowerShell & output?”建议的“过滤器时间戳”解决方案,但由于某种原因,它没有按照我的方式生成时间戳。
我完全按照发布示例进行操作,因为您可以看到我非常简单的powershell命令:
filter timestamp {"$(Get-Date -Format o): $_"}
cmd /c $DBCmd -f c:\di\mycmd.sql "postgresql://myuser:mypass@myhost/mydb" | timestamp
当检查“开始记录”生成的日志以及直接在命令行中时,结果如下:
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:
常见的mycmd.sql是pgsql函数的执行:
SELECT adt_objprog.fn_myfunction(myparams);
函数myfunction具有简单的Deletes,如下所示:
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:我确实将标题更改为更好的标题(我认为),并且进行了较小的更正。