Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16

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

有时,在两次函数调用之间保存一些全局数据或在不同函数之间共享数据非常有用。在 PL/Tcl 中可以轻松完成此操作,但必须了解一些限制。

出于安全原因,PL/Tcl 会在单独的 Tcl 解释器中执行任何一个 SQL 角色调用的函数,以供该角色使用。这可以防止一个用户意外或恶意干扰另一个用户 PL/Tcl 函数的行为。每个此类解释器将对任何 全局 Tcl 变量拥有自己的值。因此,当且仅当由同一 SQL 角色执行时,两个 PL/Tcl 函数才会共享相同的全局变量。在单个会话在多个 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 的示例。