# 44.4.PL/Tcl中的全局数据
有时,在对一个函数的两次调用之间保存一些全局数据,或者在不同的函数之间共享一些全局数据是很有用的。这在PL/Tcl中很容易实现,但必须理解一些限制。
出于安全原因,PL/Tcl在一个单独的Tcl解释器中执行任何一个SQL角色调用的函数。这可以防止一个用户对另一个用户的PL/Tcl函数的行为进行意外或恶意干扰。对于任何“全局”Tcl变量,每个这样的解释器都有自己的值。因此,当且仅当两个PL/Tcl函数由相同的SQL角色执行时,它们将共享相同的全局变量。在一个应用程序中,单个会话在多个SQL角色下执行代码(通过安全定义者
功能,使用设定角色
等)您可能需要采取明确的步骤来确保PL/Tcl函数可以共享数据。要做到这一点,请确保应该通信的功能属于同一用户,并对其进行标记安全定义者
.当然,你必须注意这些功能不能被用来做任何意外的事情。
会话中使用的所有PL/TclU函数都在同一个Tcl解释器中执行,这当然不同于用于PL/Tcl函数的解释器。因此,全局数据在PL/TclU函数之间自动共享。这不被视为安全风险,因为所有PL/TclU函数都在相同的信任级别上执行,即数据库超级用户的信任级别。
为了帮助保护PL/Tcl功能不受无意干扰,通过upvar
命令该变量的全局名称是函数的内部名称,局部名称是GD
.建议GD
用于函数的持久私有数据。常规Tcl全局变量仅用于您特别希望在多个函数之间共享的值。(请注意GD
数组仅在特定解释器中是全局的,因此它们不会绕过上述安全限制。)
使用GD
出现在spi_execp
下面是一个例子。