42.4. Datos globales en PL/Tcl #

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.