Chapter 37. PL/Tcl - Tcl 过程语言

Table of Contents
37.1. 概述
37.2. PL/Tcl 函数和参数
37.3. PL/Tcl 里的数据值
37.4. PL/Tcl 里的全局量
37.5. 在 PL/Tcl 里面访问数据库
37.6. PL/Tcl 里的触发器过程
37.7. 模块和unknown(未知)的命令
37.8. Tcl 过程名字

PL/Tcl 是一种用于 PostgreSQL 数据库系统的可装载的过程化语言, 它让我们可以用 Tcl 语言来书写函数和触发器过程。

37.1. 概述

PL/Tcl 提供 C 语言里面函数开发者所拥有的大多数功能,只有一点点限制除外。

好的限制是,所有东西都是在一个安全的 Tcl 解释器里面运行的。 除了安全的 Tcl 一个有限的命令集外,只有很少的几个命令可以通过 SPI 访问数据库以及通过elog()生成错误信息。不象 C 函数那样, (Tcl)没有办法访问数据库后端内部或者获得 OS 级的 PostgreSQL 服务器进程的权限。 因此,任何非特权的数据库用户都可以被允许使用这种语言。

另外的实现级限制是 Tcl 过程不能用于创建新数据库类型的输入/输出函数。

有时候我们需要写一些不受安全 Tcl 限制的 Tcl 函数,比如, 我们可能需要一个可以发送邮件的 Tcl 函数。要处理这样的问题, 我们有一个PL/Tcl的变种,叫PL/TclU(意思是不可信的 Tcl)。 这个语言和 PL/Tcl 是完全一样的,只不过使用了一个完整的 Tcl 解释器。 如果你使用了PL/TclU,那么你必须把它安装成一种不可信的过程语言, 这样只有数据库超级用户可以用它创建函数。 PL/TclU函数的作者必须注意:你写的函数一定不要做任何预算外的事情, 因为它能干所有登录为数据库管理员的用户能干的事情。

如果在安装过程的配置步骤中声明了 Tcl 支持, 那么 PL/TCLPL/TclU 的调用句柄是在制作时自动制作并安装到 PostgreSQL 库目录中去的。 要在某个特定的数据库中安装 PL/Tcl 和/或 PL/TclU,那么你可以使用 createlang 程序。 比如 createlang pltcl dbnamecreatelang pltclu dbname。