我正在尝试通过 plpgsql 函数中的异常来检测错误的 postgres PL/proxy 分片连接。当直接调用函数时,这完全符合预期(尝试访问坏分片会引发异常)。但是,现有代码库通过 RUN ON 语句中的 plproxy 函数间接调用该函数,在这种情况下,访问任何分片(无论好坏)都会引发异常。有没有其他人看到这个和/或有解决方案或解决方法?
这是问题的一个精简示例:
A)FunctionA是一个plproxy函数,它有一行:RUN ON functionB($1, NULL);
B) functionB 是一个 plpgsql 函数,它有一行:SELECT db_index FROM functionC();
C) functionC 也是一个 plpgsql 函数,它有检查连接的代码: FOR db_id IN () LOOP BEGIN PERFORM check_shard(db_id); -- 这只是调用一个在分片上运行的函数 EXCEPTION WHEN internal_error THEN RAISE NOTICE 'CAUGHT EXCEPTION FOR ID %', db_id; 结尾; 结束循环;
当在 SELECT 中直接调用 functionB 或 functionC 时,好的分片不会抛出异常。但是当在 RUN ON 语句中调用函数调用 plproxy functionA 时,所有分片都会抛出异常。因此,导致此问题的 plproxy 函数或 RUN ON 语句似乎发生了一些事情。
任何帮助将不胜感激!