PL/Tclは、いくつか制限がありますが、C言語で書かれた関数と同じような能力を提供します。 さらに、Tclで利用できる、強力な文字列処理ライブラリを持っています。
すべてがTclインタプリタの安全なコンテキスト内で実行されるという制約はやむを得ないものですが、逆に良い制約でもあります。
安全なTclの制約付きのコマンドセットに、SPIを使ってデータベースにアクセスするコマンドと、elog()
を使ってメッセージを処理するためのコマンドなどの、わずかなコマンドが追加されています。
C関数では可能ですが、PL/Tclにはデータベースサーバ内部にアクセスする方法や、PostgreSQLサーバプロセスの権限によるOSレベルのアクセスを行う方法はありません。
この結果、非特権データベースユーザがこの言語を信頼して使用することができます。
つまり、無制限の権限は与えられません。
その他の注意すべき実装上の制約として、Tcl関数を使用して新しいデータ型用の入出力関数を作成することはできません。
例えば、メールを送るTcl関数が必要な場合など、安全なTclに制約されないTcl関数を書くことが望ましい場合があります。 このような場合、PL/TclU(信頼されないTcl)というPL/Tclの亜種を使用します。 これは、完全なTclインタプリタが使用されているという点以外の違いはありません。 PL/TclUを使用する場合は、信頼されていない手続き型言語としてインストールする必要があります。 そうすることによって、データベースのスーパーユーザのみが関数を作成することができるようになります。 PL/TclU関数ではデータベース管理者としてログインしたユーザができるあらゆることの実行が可能となるので、作成する際に、この関数が意図された以外のことを行わないように細心の注意を払う必要があります。
インストール時にTclサポートの設定が指定されていれば、PL/TclとPL/TclU呼び出しハンドラの共有オブジェクトコードは自動的に作成され、PostgreSQLのライブラリディレクトリにインストールされます。 PL/TclまたはPL/TclUの一方あるいは両方を特定のデータベースにインストールしたい場合は、createlangプログラムを使用してください。 例えば、createlang pltcl dbnameまたはcreatelang pltclu dbnameです。