DBE_PLDEBUGGER Schema

    对应权限角色为gs_role_pldebugger,可以由管理员用户通过如下命令将debugger权限赋权给该用户。

    需要有两个客户端连接数据库,一个客户端负责执行调试接口作为debug端,另一个客户端执行调试函数,控制server端存储过程执行。示例如下。

    • 准备调试

      通过PG_PROC,查找到待调试存储过程的oid,并执行DBE_PLDEBUGGER.turn_on(oid)。本客户端就会作为server端使用。

      1. AS
      2. BEGIN
      3. INSERT INTO t1 (a) VALUES (x);
      4. END;
      5. /
      6. CREATE PROCEDURE
      7. openGauss=# SELECT OID FROM PG_PROC WHERE PRONAME='test_debug';
      8. oid
      9. (1 row)
      10. openGauss=# SELECT * FROM DBE_PLDEBUGGER.turn_on(16389);
      11. nodename | port
      12. ----------+------
      13. datanode | 0
      14. (1 row)
    • 开始调试

      server端执行存储过程,会在存储过程内第一条SQL语句前hang住,等待debug端发送的调试消息。仅支持直接执行存储过程的调试,不支持通过trigger调用执行的存储过程调试。

      再起一个客户端,作为debug端,通过turn_on返回的数据,调用DBE_PLDEBUGGER.attach关联到该存储过程上进行调试。

      1. openGauss=# SELECT * FROM DBE_PLDEBUGGER.attach('datanode',0);
      2. funcoid | funcname | lineno | query
      3. (1 row)

      在执行attach的客户端调试,执行下一条statement。

      在执行attach的客户端调试,将当前所有变量输出。

      1. openGauss=# SELECT * FROM DBE_PLDEBUGGER.info_locals();
      2. varname | vartype | value | package_name
      3. ---------+---------+-------+--------------
      4. $1 | int4 | 1 |
      5. (1 row)

      直接执行完成当前正在调试的存储过程。

      直接退出当前正在调试的存储过程,不执行尚未执行的语句。

      1. openGauss=# SELECT * FROM DBE_PLDEBUGGER.abort();
      2. abort
      3. -------
      4. (1 row)

      存储过程执行结束后,调试会自动退出,再进行调试需要重新attach关联。如果server端不需要继续调试,可执行turn_off关闭,或退出session。具体调试接口请见下面列表。

      表 1 DBE_PLDEBUGGER