40.1. Instalação de linguagem procedural #

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.

  1. 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.

  2. O tratador deve ser declarado com o comando

    CREATE FUNCTION nome_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.

  3. 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 FUNCTION nome_da_função_em_linha(internal)
        RETURNS void
        AS 'caminho-para-o-objeto-compartilhado'
        LANGUAGE C;
    

  4. 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 FUNCTION nome_da_função_validadora(oid)
        RETURNS void
        AS 'caminho-para-o-objeto-compartilhado'
        LANGUAGE C STRICT;
    

  5. Por fim, a linguagem procedural deve ser declarada com o comando

    CREATE [TRUSTED] LANGUAGE nome_da_linguagem
        HANDLER nome_da_função_tratadora
        [INLINE nome_da_função_em_linha]
        [VALIDATOR nome_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.