Глобальные данные в PL/Tcl
Эта страница переведена при помощи нейросети GigaChat.
Иногда бывает полезно иметь некоторые глобальные данные, которые хранятся между двумя вызовами функции или совместно используются различными функциями. Это легко сделать в PL/Tcl, но есть некоторые ограничения, которые необходимо понять.
По соображениям безопасности PL/Tcl выполняет функции, вызываемые любой одной ролью SQL, в отдельном интерпретаторе Tcl для этой роли. Это предотвращает случайное или злонамеренное вмешательство одного пользователя в поведение функций PL/Tcl другого пользователя. У каждого такого интерпретатора будут свои значения для любых «глобальных» переменных Tcl. Таким образом, две функции PL/Tcl будут совместно использовать одни и те же глобальные переменные тогда и только тогда, когда они выполняются одной и той же ролью SQL. В приложении, в котором одно сеанс выполняет код под несколькими ролями SQL (через SECURITY DEFINER
функции, использование SET ROLE
, и т.д.), может понадобиться предпринять явные шаги, чтобы убедиться, что функции PL/Tcl могут обмениваться данными. Для этого убедитесь, что функции, которые должны взаимодействовать, принадлежат одному и тому же пользователю, и пометьте их SECURITY DEFINER
. Конечно, необходимо позаботиться о том, чтобы такие функции не могли использоваться для выполнения непреднамеренных действий.
Все функции PL/TclU, используемые в сеансе, выполняются в одном и том же интерпретаторе Tcl, который, конечно же, отличается от интерпретатора(ов), используемого для функций PL/Tcl. Таким образом, глобальные данные автоматически разделяются между функциями PL/TclU. Это не считается угрозой безопасности, поскольку все функции PL/TclU выполняются с одним уровнем доверия, а именно с уровнем привилегий суперпользователя базы данных.
Чтобы помочь защитить функции PL/Tcl от непреднамеренного вмешательства друг в друга, каждой функции предоставляется доступ к глобальной массиву через команду upvar
. Глобальное имя этой переменной – внутреннее имя функции, а локальное имя – GD
. Рекомендуется использовать GD
для постоянных частных данных функции. Используйте обычные глобальные переменные Tcl только для значений, которые специально намерены совместно использовать несколькими функциями. Обратите внимание, что массивы GD
являются глобальными только внутри определенного интерпретатора, поэтому они не обходят упомянутые выше ограничения безопасности.
Пример использования GD
приведен в примере spi_execp
дальше.