Quelque fois, il est utile d'avoir des données globales qui sont conservées entre deux appels à une fonction ou qui sont partagées entre plusieurs fonctions. Ceci peut être facilement obtenu car toutes les fonctions PL/Tcl exécutées dans une session partagent le même interpréteur Tcl sûr. Donc, toute variable globale Tcl est accessible aux appels de fonctions PL/Tcl et persisteront pour la durée de la session SQL (notez que les fonctions PL/TclU partagent de la même façon les données globales mais elles sont dans un interpréteur Tcl différent et ne peuvent pas communiquer avec les fonctions PL/Tcl). C'est facile à faire en PL/Tcl mais il existe quelques restrictions qui doivent être comprises.
Pour des raisons de sécurité, PL/Tcl exécute les fonctions appelées par
tout rôle SQL dans un interpréteur Tcl séparé pour ce rôle. Ceci empêche
une interférence accidentelle ou malicieuse d'un utilisateur avec le
comportement des fonctions PL/Tcl d'un autre utilisateur. Chaque
interpréteur aura ses propres valeurs pour toutes les variables globales
Tcl. Du coup, deux fonctions PL/Tcl partageront les mêmes variables
globales si et seulement si elles sont exécutées par le même rôle SQL.
Dans une application où une seule session exécute du code sous plusieurs
rôles SQL(via des fonctions SECURITY DEFINER
, l'utilisation
de SET ROLE
, etc), vous pouvez avoir besoin de mettre des
étapes explicites pour vous assurer que les fonctions PL/Tcl peuvent
partager des données. Pour cela, assurez-vous que les fonctions qui doivent
communiques ont pour propriétaire le même utilisateur et marquez-les avec
l'option SECURITY DEFINER
. Bien sûr, vous devez faire attention
à ce que de telles fonctions ne puissent pas être utilisées pour faire
des choses non souhaitées.
Toutes les fonctions PL/TclU utilisées dans une session s'exécutent avec le même interpréteur Tcl, qui est bien sûr différent des interpréteurs utilisées pour les fonctions PL/Tcl. Donc les données globales sont automatiquement partagées entre des fonctions PL/TclU. Ceci n'est pas considéré comme un risque de sécurité parce que toutes les fonctions PL/TclU s'exécutent dans le même niveau de confiance, celui d'un superutilisateur.
Pour aider à la protection des fonctions PL/Tcl sur les interférences non
intentionnelles, un tableau global est rendu disponible pour chaque
fonction via la commande upvar
. Le nom global de cette
variable est le nom interne de la fonction alors que le nom local est
GD
. Il est recommandé d'utiliser GD
pour les
données privées persistantes d'une fonction. Utilisez les variables globales
Tcl uniquement pour les valeurs que vous avez l'intention de partager avec
les autres fonctions. (Notez que les tableaux
GD
sont seulement globaux à l'intérieur d'un interpréteur
particulier, pour qu'ils ne franchissent pas les restrictions de sécurité
mentionnées ci-dessus.)
Un exemple de l'utilisation de GD
apparaît dans l'exemple
spi_execp
ci-dessous.