Às vezes é útil ter alguns dados globais mantidos entre duas chamadas para uma função, ou compartilhados entre funções diferentes. Isto é feito facilmente no PL/Tcl, mas existem algumas restrições que devem ser compreendidas.
Por razões de segurança, o PL/Tcl executa
funções chamadas por qualquer função de banco de dados
(identificador de autorização/role)
em um interpretador Tcl separado para esta
função de banco de dados.
Isto evita interferência acidental ou maliciosa de um usuário no
comportamento das funções PL/Tcl de outro usuário.
Cada um desses interpretadores terá seus próprios valores para
quaisquer variáveis Tcl “globais”.
Assim, duas funções PL/Tcl vão compartilhar as
mesmas variáveis globais se, e somente se, forem executadas pela
mesma função de banco de dados.
Em uma aplicação que uma única sessão executa o código sob múltiplas
funções de banco de dados (via funções
SECURITY DEFINER, uso de SET ROLE,
etc.), talvez seja necessário executar etapas explícitas para garantir
que as funções PL/Tcl possam compartilhar dados.
Para fazer isto, é necessário que as funções que devem se
comunicar pertençam ao mesmo usuário, e sejam marcadas como
SECURITY DEFINER.
É claro que se deve tomar cuidado para que estas funções não
possam ser usadas para fazer algo não intencional.
Todas as funções PL/TclU usadas em uma sessão são executadas no mesmo interpretador Tcl, que obviamente é distinto do(s) interpretador(es) usado(s) para funções PL/Tcl. Portanto, os dados globais são automaticamente compartilhados entre funções PL/TclU. Isto não é considerado um risco de segurança, porque todas as funções PL/TclU são executadas no mesmo nível de confiança, ou seja, o de um superusuário do banco de dados.
Para ajudar a proteger as funções PL/Tcl contra
interferências involuntárias umas nas outras, é disponibilizada
uma matriz global para cada função através do comando
upvar.
O nome global dessa variável é o nome interno da função, e o nome
local é GD.
É recomendado que seja usado GD para os dados
privados persistentes de uma função.
Deve-se usar variáveis globais Tcl regulares
apenas para valores que se pretende especificamente que sejam
compartilhados entre múltiplas funções.
(Note que as matrizes GD são globais apenas
em um interpretador específico, portanto elas não contornam
as restrições de segurança mencionadas acima.)
Um exemplo de uso de GD aparece no exemplo
spi_execp mais adiante.