Uma linguagem procedural deve ser “instalada” em cada
banco de dados onde será utilizada.
Mas as linguagens procedurais instaladas no banco de dados
template1 ficam automaticamente disponíveis
em todos os bancos de dados criados posteriormente, porque suas
entradas em template1 serão copiadas pelo
comando CREATE DATABASE.
Assim, o administrador do banco de dados pode decidir quais
linguagens estarão disponíveis em quais bancos de dados, e pode
disponibilizar algumas linguagens por padrão, se desejar.
Para as linguagens fornecidas com a distribuição padrão, basta
executar CREATE EXTENSION
nome_da_linguagem para instalar a
linguagem no banco de dados corrente.
O procedimento manual descrito a seguir é recomendado apenas para
a instalação de linguagens que não foram empacotadas como extensões.
Instalação manual de linguagem procedural
Uma linguagem procedural é instalada em um banco de dados em cinco
etapas, que devem ser executadas por um superusuário do banco de dados.
Geralmente, os comandos SQL necessários
devem ser empacotados como script de instalação da
“extensão”, para que o comando
CREATE EXTENSION possa ser usado para executá-los.
O objeto compartilhado que serve de tratador da linguagem deve ser construído e instalado em um diretório de biblioteca apropriado. Funciona da mesma forma que construir e instalar módulos com funções C regulares definidas pelo usuário; veja Compilação e ligação de funções carregadas dinamicamente. Muitas vezes, o tratador da linguagem dependerá de uma biblioteca externa que fornece o mecanismo de linguagem de programação real; se for este o caso, deverá ser instalado também.
O tratador deve ser declarado com o comando
CREATE FUNCTIONnome_da_função_tratadora() RETURNS language_handler AS 'caminho-para-o-objeto-compartilhado' LANGUAGE C;
O tipo de dados retornado especial language_handler,
informa ao sistema de banco de dados que esta função não retorna
um dos tipos de dados SQL definidos, não podendo
ser utilizado diretamente nas declarações SQL.
Opcionalmente, o tratador da linguagem pode fornecer uma função
tratadora “em-linha”
(inline), que executa blocos de
código anônimos
(comandos DO)
escritos nesta linguagem.
Se for fornecida pela linguagem uma função tratadora em-linha,
esta função deverá ser declarada com um comando como
CREATE FUNCTIONnome_da_função_em_linha(internal) RETURNS void AS 'caminho-para-o-objeto-compartilhado' LANGUAGE C;
Opcionalmente, o tratador da linguagem pode fornecer uma função
“validadora”, que verifica a exatidão de uma
definição de função sem realmente executá-la.
A função validadora será chamada por
CREATE FUNCTION, se existir.
Se for fornecida pela linguagem uma função validadora,
esta função deverá ser declarada com um comando como
CREATE FUNCTIONnome_da_função_validadora(oid) RETURNS void AS 'caminho-para-o-objeto-compartilhado' LANGUAGE C STRICT;
Por fim, a linguagem procedural deve ser declarada com o comando
CREATE [TRUSTED] LANGUAGEnome_da_linguagemHANDLERnome_da_função_tratadora[INLINEnome_da_função_em_linha] [VALIDATORnome_da_função_validadora];
A palavra-chave opcional TRUSTED especifica
que a linguagem não permite acesso a dados que o usuário não
teria de outra forma.
As linguagens confiáveis são projetadas para usuários comuns de
banco de dados (aqueles sem privilégio de superusuário),
permitindo que eles criem funções e procedimentos com segurança.
Como as funções das linguagens procedurais são executadas dentro
do servidor de banco de dados, o sinalizador
TRUSTED deve ser especificado apenas para as
linguagens que não permitem acesso às funções internas do
servidor de banco de dados, ou ao sistema de arquivos.
As linguagens
PL/pgSQL,
PL/Tcl, e
PL/Perl
são consideradas confiáveis; as linguagens
PL/TclU,
PL/PerlU, e
PL/PythonU
são projetadas para fornecer funcionalidades ilimitadas,
não devendo ser marcadas como confiáveis.
O Exemplo 40.1 mostra como o procedimento de instalação manual funcionaria com a linguagem PL/Perl.
Exemplo 40.1. Instalação manual do PL/Perl
O comando a seguir informa ao servidor de banco de dados onde encontrar o objeto compartilhado para a função tratadora de chamada da linguagem PL/Perl:
CREATE FUNCTION plperl_call_handler() RETURNS language_handler AS
'$libdir/plperl' LANGUAGE C;
PL/Perl tem uma função tratadora em-linha, e uma função validadora, portanto, também são declaradas:
CREATE FUNCTION plperl_inline_handler(internal) RETURNS void AS
'$libdir/plperl' LANGUAGE C STRICT;
CREATE FUNCTION plperl_validator(oid) RETURNS void AS
'$libdir/plperl' LANGUAGE C STRICT;
Então o comando
CREATE TRUSTED LANGUAGE plperl
HANDLER plperl_call_handler
INLINE plperl_inline_handler
VALIDATOR plperl_validator;
define que as funções declaradas anteriormente devem ser chamadas
para funções e procedimentos onde o atributo
language é definido como plperl.
Em uma instalação padrão do PostgreSQL, o tratador para a linguagem PL/pgSQL é criado e instalado no diretório “library”; além disso, a própria linguagem PL/pgSQL é instalada em todos os bancos de dados. Se estiver configurado suporte para Tcl, os tratadores para PL/Tcl e PL/TclU serão construídos e instalados no diretório de biblioteca, mas a linguagem em si não será instalada em nenhum banco de dados por padrão. Da mesma forma, os tratadores para PL/Perl e PL/PerlU serão construídos e instalados se o suporte a Perl estiver configurado, e o tratador para PL/PythonU será instalado se o suporte a Python estiver configurado, mas estas linguagens não são instalados por padrão.