41.7. 模块和unknown的命令

PL/Tcl 使用时支持自动加载 Tcl 代码。它识别一个特殊的pltcl_modules表, 该表被认为包含 Tcl 代码的模块。如果存在这个表,则在数据库会话中的PL/Tcl函数第一次执行之前, 从该表中抓取unknown模块并加载到 Tcl 解释器中。(如果在一个会话中有多个, 将单独为每个Tcl解释器发生;参阅第 41.4 节。)

因为unknown模块实际上可以包含任何你需要的初始化脚本,它通常是定义为一个Tcl unknown过程,在 Tcl 不能识别一个调用的过程名的时候就调用它。PL/Tcl 这个过程的标准版本试图在pltcl_modules里找到一个定义所需要过程的模块。 如果找到一个,那么把它加载入解释器,然后允许继续按照原来的过程调用处理。另外还定义了一个 pltcl_modfuncs表,它提供了哪个函数由哪个模块定义的索引,因此查找过程相当快。

PostgreSQL包括维护这些表的支持脚本:pltcl_loadmod, pltcl_listmod, pltcl_delmod以及标准share/unknown.pltclunknown模块的源代码。这个模块必须一开始就加载入每个数据库才能支持自动加载机制。

pltcl_modulespltcl_modfuncs必需可以为所有人读取, 但是把它做成只有数据库管理员可写并拥有是明智的。作为一个安全预防, PL/Tcl将忽略pltcl_modules(并且因此,不尝试加载unknown模块) 除非它被超级用户所有。但是这个表上的更新权限可以赋予给其他用户,如果你足够信任他们。