PostgreSQL 9.6.0 手册 | |||
---|---|---|---|
上一页 | 上一级 | 章 42. PL/Tcl - Tcl 过程语言 | 下一页 |
PL/Tcl 提供了大部分函数编写者在 C 语言中能够获得的能力,虽然有一些限制,但是却额外提供了 Tcl 中强大的字符串处理库。
一种强制性的好限制是所有被执行的东西都处于 Tcl 解释器的安全上下文中。除了安全 Tcl 的有限的命令集合之外,只有几个通过 SPI 访问数据库的命令以及通过elog()
产生消息的命令。PL/Tcl 没有提供访问数据库服务器内部或者在PostgreSQL服务器进程权限之下得到 OS-级访问的方法,而 C 函数是可以那样做的。因此,非特权数据库用户可以使用这种语言,它不会给予他们无限制的权利。
其他值得注意的实现限制是 Tcl 函数不能被用来创建新数据类型的输入/输出函数。
有时候我们想要编写不受安全 Tcl 限制的 Tcl 函数。例如,我们可能想要一个能发送电子邮件的 Tcl 函数。要处理这些情况,可以使用一种PL/Tcl的变体,它被称为PL/TclU(用于非可信 Tcl)。它其实是完全相同的一种语言,不过它使用了一个完整的 Tcl 解释器。如果使用了PL/TclU,它必须被安装为一种非可信的过程语言,这样只有数据库超级用户可以用它来创建函数。PL/TclU函数的编写者必须注意该函数不能被用来做其设计目的之外的事情,因为该函数能做一个作为数据库管理员登录的用户可以做的任何事情。
如果在安装过程的配置步骤中指定了 Tcl 支持,PL/Tcl以及PL/TclU调用处理器的共享对象代码会被自动编译并且被安装在PostgreSQL的库目录中。要在一个特定数据库中安装PL/Tcl或者PL/TclU,请使用CREATE EXTENSION命令或者createlang程序,例如createlang pltcl dbname或者createlang pltclu dbname。