2024年9月26日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:开发版
不受支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4

42.4. PL/Tcl 中的全局数据 #

有时,在两次调用函数之间或在不同函数之间共享一些全局数据会很有用。这在 PL/Tcl 中很容易实现,但需要了解一些限制。

出于安全原因,PL/Tcl 为任何 SQL 角色调用的函数在该角色的单独 Tcl 解释器中执行。这可以防止一个用户意外或恶意地干扰另一个用户 PL/Tcl 函数的行为。每个这样的解释器都将拥有其自身任何“全局”Tcl 变量的值。因此,只有当两个 PL/Tcl 函数由相同的 SQL 角色执行时,它们才会共享相同的全局变量。在一个会话在多个 SQL 角色下执行代码(通过SECURITY DEFINER 函数、使用SET ROLE 等)的应用程序中,您可能需要采取明确的步骤来确保 PL/Tcl 函数可以共享数据。为此,请确保应该通信的函数由同一个用户拥有,并将它们标记为SECURITY DEFINER。当然,您必须注意这些函数不能用于执行任何意外的操作。

在一个会话中使用的所有 PL/TclU 函数都在同一个 Tcl 解释器中执行,当然,它与用于 PL/Tcl 函数的解释器不同。因此,PL/TclU 函数之间自动共享全局数据。这不被视为安全风险,因为所有 PL/TclU 函数都在相同的信任级别(即数据库超级用户的信任级别)下执行。

为了帮助保护 PL/Tcl 函数免受意外的相互干扰,每个函数都可以通过upvar 命令访问一个全局数组。此变量的全局名称是函数的内部名称,局部名称是GD。建议将GD 用于函数的持久私有数据。仅对您专门打算在多个函数之间共享的值使用常规的 Tcl 全局变量。(请注意,GD 数组仅在特定的解释器中是全局的,因此它们不会绕过上面提到的安全限制。)

下面spi_execp 示例中显示了使用GD 的示例。

提交更正

如果您在文档中看到任何不正确的内容,与您对特定功能的体验不符,或者需要进一步说明,请使用此表单 报告文档问题。