42.9. 模块和unknown 命令

PL/Tcl 支持在使用时自动装载 Tcl 代码。它识别一个特殊的表pltcl_modules,其中包含 Tcl 代码的模块。如果这个表存在,会从该表中取得模块unknown并且在数据库会话中第一次执行一个 PL/Tcl 函数之前立即将之载入到 Tcl 解释器中(如果一个会话中用到了多个解释器,对每一个 Tcl 解释器都会独立发生这样一个过程,见第 42.4 节)。

虽然unknown模块实际上可以包含需要的任何初始化脚本,它通常会定义一个 Tcl 的unknown过程,只要 Tcl 无法识别一个被调用的过程名就会调用这个过程。这个过程的PL/Tcl标准版本会尝试在pltcl_modules中寻找一个定义所需过程的模块。如果找到,它就会被载入到解释器,然后执行过程被允许继续初始尝试的过程调用。二级表pltcl_modfuncs提供了有关哪些模块定义了哪些函数的索引,因此查询可以相当地快。

PostgreSQL发布包括维护这些表的支持脚本: pltcl_loadmodpltcl_listmodpltcl_delmod,以及share/unknown.pltcl中标准unknown模块的源码。这个模块必须初始就被载入到每个数据库来支持自动载入机制。

pltcl_modulespltcl_modfuncs必须对所有人可读,但是最好只让数据库管理员拥有它们并且可以写它们。作为一种安全防范措施,如果pltcl_modules不被一个超级用户拥有,PL/Tcl 将会忽略它(并且因此不会尝试载入unknown模块)。如果你足够信任其他用户,可以将这个表上的更新特权授予它们。