PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

42.1. 概述 #

PL/Tcl 以少量限制为代价,为函数编写者提供了 C 语言中的大部分能力, 并额外提供了 Tcl 所拥有的强大字符串处理库。

一项引人注目的良好限制是:一切都在 Tcl 解释器 上下文的安全性之内执行。 除了安全 Tcl 的受限命令集之外,只有少数几个命令可用于通过 SPI 访问 数据库以及通过 elog() 发出消息。 PL/Tcl 不提供访问数据库服务器内部机制的途径,也不提供以 PostgreSQL 服务器进程的权限获取操作系统 级访问的途径,而 C 函数可以做到这些。 因此,无特权数据库用户可以被信任使用这种语言;它不会赋予他们无限的 权力。

另一个值得注意的实现限制是:Tcl 函数不能被用来为新数据类型创建 输入/输出函数。

有时人们希望编写不受安全 Tcl 限制的 Tcl 函数。 例如,可能想要一个发送电子邮件的 Tcl 函数。 为了处理这些情况,有一种称为 PL/TclU (非受信 Tcl)的 PL/Tcl 变体。 它是完全相同的语言,只是使用一个完整的 Tcl 解释器。如果使用 PL/TclU,必须把它安装为非受信的过程 语言,这样只有数据库超级用户才能在其中创建函数。 PL/TclU 函数的作者必须注意该函数不能被用来做任何不想要的事情,因为它能够 做数据库管理员登录后所能做的任何事情。

如果在安装过程的配置步骤中指定了 Tcl 支持, PL/Tcl 和 PL/TclU 调用处理器的共享对象代码会 被自动构建并安装到 PostgreSQL 库目录中。 要在特定数据库中安装 PL/Tcl 和/或 PL/TclU,请使用 CREATE EXTENSION 命令,例如 CREATE EXTENSION pltcl 或 CREATE EXTENSION pltclu。