A veces es útil tener algunos datos globales que se mantienen entre dos llamadas a una función o se comparten entre diferentes funciones. Esto se hace fácilmente en PL/Tcl, pero hay algunas restricciones que deben entenderse.
Por razones de seguridad, PL/Tcl ejecuta las funciones llamadas por cualquier rol SQL
en un intérprete Tcl separado para ese rol. Esto evita la interferencia
accidental o maliciosa de un usuario con el comportamiento de las funciones
PL/Tcl de otro usuario. Cada uno de estos intérpretes tendrá sus propios
valores para cualquier variable Tcl “global”. Por lo tanto, dos funciones
PL/Tcl compartirán las mismas variables globales si y solo si son
ejecutadas por el mismo rol SQL. En una aplicación en la que una sola
sesión ejecuta código bajo múltiples roles SQL (a través de funciones
SECURITY DEFINER, el uso de SET ROLE, etc.), es posible que debas
tomar medidas explícitas para garantizar que las funciones PL/Tcl puedan compartir datos. Para
hacer eso, asegúrate de que las funciones que deben comunicarse sean propiedad
del mismo usuario, y márcalas como SECURITY DEFINER. Debes,
por supuesto, tener cuidado de que dichas funciones no puedan ser utilizadas para hacer nada
no deseado.
Todas las funciones PL/TclU utilizadas en una sesión se ejecutan en el mismo intérprete Tcl, que por supuesto es distinto del intérprete o intérpretes utilizados para las funciones PL/Tcl. Así que los datos globales se comparten automáticamente entre las funciones PL/TclU. Esto no se considera un riesgo de seguridad porque todas las funciones PL/TclU se ejecutan al mismo nivel de confianza, a saber, el de un superusuario de la base de datos.
Para ayudar a proteger las funciones PL/Tcl de interferencias no intencionadas
entre sí, se pone a disposición de cada función un array global a través del
comando upvar. El nombre global de esta variable es el nombre
interno de la función, y el nombre local es GD. Se recomienda que
se utilice GD para los datos privados persistentes de una función.
Utiliza variables globales normales de Tcl solo para valores que desees específicamente
compartir entre múltiples funciones. (Ten en cuenta que los arrays GD solo
son globales dentro de un intérprete particular, por lo que no evitan las
restricciones de seguridad mencionadas anteriormente).
Un ejemplo del uso de GD aparece en el
ejemplo de spi_execp más abajo.