42.9. Модули и команда unknown

PL/Tcl поддерживает автозагрузку кода Tcl. Для этого он задействует специальную таблицу, pltcl_modules, предназначенную для размещения модулей кода Tcl. Если эта таблица существует, из таблицы выбирается модуль unknown и загружается в интерпретатор Tcl непосредственно перед первым выполнением функции PL/Tcl в сеансе базы данных. (Это происходит независимо для каждого интерпретатора Tcl, если их несколько в одном сеансе; см. Раздел 42.4.)

Хотя модуль unknown может на самом деле содержать любой нужный вам скрипт инициализации, обычно в нём определяется процедура unknown языка Tcl, которая вызывается всякий раз, когда Tcl не распознаёт имя вызываемой процедуры. Принятая в PL/Tcl версия этой процедуры пытается найти в pltcl_modules модуль, в котором будет определена требуемая процедура. Если такой модуль находится, он загружается в интерпретатор и затем выполнение изначального вызова процедуры может быть продолжено. Дополнительная таблица pltcl_modfuncs содержит индекс, связывающий функции с модулями, в которых они определены, так что поиск выполняется довольно быстро.

В составе Postgres Pro поставляются вспомогательные скрипты для обслуживания этих таблиц: pltcl_loadmod, pltcl_listmod, pltcl_delmod, а также исходный код стандартного модуля unknown в share/unknown.pltcl. Для поддержки механизма автозагрузки этот модуль должен изначально загружаться в каждую базу данных.

Таблицы pltcl_modules и pltcl_modfuncs должны быть доступны на чтение всем, но разрешать запись в них разумно только администратору базы данных (и только он должен быть их владельцем). В качестве меры предосторожности PL/Tcl будет игнорировать таблицу pltcl_modules (и таким образом, не будет пытаться загрузить модуль unknown), если она принадлежит не суперпользователю. Но право на изменение данных в ней можно дать и другим пользователям, если они заслуживают такого доверия.