CREATE LANGUAGE

CREATE LANGUAGE — define uma nova linguagem procedural

Sinopse

CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE nome
    HANDLER tratador_de_chamadas [ INLINE tratador_em_linha ] [ VALIDATOR função_validadora ]
CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE nome

Descrição

O comando CREATE LANGUAGE registra uma nova linguagem procedural em um banco de dados do PostgreSQL. Em seguida, poderão ser definidas funções e procedimentos nesta nova linguagem.

O comando CREATE LANGUAGE efetivamente associa o nome da linguagem com as funções do tratador responsáveis pela execução das funções escritas na linguagem. Veja Escrita de tratador de linguagem procedural para obter mais informações sobre tratadores de linguagem.

O comando CREATE OR REPLACE LANGUAGE irá criar uma nova linguagem, ou substituir uma definição existente. Se a linguagem já existir, seus parâmetros serão atualizados segundo o comando, mas as configurações de posse e permissões da linguagem não serão alteradas, e quaisquer funções existentes escritas na linguagem serão consideradas válidas.

É necessário ter o privilégio de superusuário do PostgreSQL para registrar uma nova linguagem, ou alterar os parâmetros de uma linguagem existente. Entretanto, uma vez criada a linguagem, é válido atribuir a posse dela a um não-superusuário, que poderá removê-la, alterar suas permissões, mudar seu nome, ou atribuí-la a um novo dono. (Entretanto, não se deve atribuir a posse das funções C subjacentes a um não-superusuário; isto criaria um caminho para escalar os privilégios para este usuário.)

A forma do comando CREATE LANGUAGE que não fornece nenhuma função tratadora está obsoleta. Para manter a compatibilidade com os arquivos de cópia de segurança antigos, este comando é interpretado como CREATE EXTENSION. Isto irá funcionar se a linguagem tiver sido empacotada em uma extensão com o mesmo nome, que é a maneira convencional de configurar linguagens procedurais.

Parâmetros

TRUSTED

TRUSTED especifica que a linguagem não concede acesso a dados que o usuário não teria acesso de outra forma. Se esta palavra-chave for omitida ao registrar a linguagem, somente os usuários com o privilégio de superusuário do PostgreSQL poderão usar esta linguagem para criar novas funções.

PROCEDURAL

Esta é uma palavra ruído.

nome

O nome da nova linguagem procedural. O nome deve ser único entre as linguagens no banco de dados.

HANDLER tratador_de_chamadas

O tratador_de_chamadas é o nome de uma função previamente registrada, que será chamada para executar as funções escritas na linguagem procedural. O tratador de chamadas para uma linguagem procedural deve ser escrito em uma linguagem compilada, como C com convenção de chamada versão 1, e registrado no PostgreSQL como uma função sem argumentos, e retornando o tipo de dados language_handler, um tipo de dados simbólico (placeholder), usado simplesmente para identificar a função como tratadora de chamadas.

INLINE tratador_em_linha

O tratador_em_linha é o nome de uma função previamente registrada, que será chamada para executar um bloco de código anônimo (o comando DO) escrito nesta linguagem. Se não for especificada nenhuma função para tratador_em_linha, a linguagem não fornecerá suporte a blocos de código anônimos. A função tratadora deve receber um argumento do tipo internal, que será a representação interna do comando DO, e normalmente retornará void. O valor retornado pela função tratadora é ignorado.

VALIDATOR função_validadora

A função_validadora é o nome de uma função previamente registrada, que será chamada quando for criada uma nova função escrita na linguagem, para validar a nova função. Se não for especificada nenhuma função validadora, uma nova função escrita nesta linguagem não será verificada quando for criada. A função validadora deve receber um argumento do tipo de dados oid, que será o OID da função a ser criada, e normalmente retornará void.

A função validadora normalmente inspecionaria o corpo da função quanto à correção sintática, mas também pode examinar outras propriedades da função, por exemplo, se a linguagem não puder lidar com certos tipos de dados de argumento. Para sinalizar um erro, a função validadora deve usar a função ereport(). O valor retornado pela função validadora é ignorado.

Notas

É usado o comando DROP LANGUAGE para remover linguagens procedurais.

O catálogo do sistema pg_language registra informações sobre as linguagens atualmente instaladas. Além disso, o meta-comando \dL do psql lista as linguagens instaladas.

Para criar funções em uma linguagem procedural, o usuário deve ter o privilégio USAGE para a linguagem. Por padrão, é concedido USAGE para PUBLIC (ou seja, todos) para as linguagens confiáveis. Isto pode ser revogado, se desejado.

Linguagens procedurais são locais para bancos de dados individuais. No entanto, a linguagem pode ser instalada no banco de dados template1, o que fará com que esteja disponível automaticamente em todos os bancos de dados criados posteriormente.

Exemplo

Uma sequência mínima para criar uma nova linguagem procedural é:

CREATE FUNCTION plsample_call_handler() RETURNS language_handler
    AS '$libdir/plsample'
    LANGUAGE C;
CREATE LANGUAGE plsample
    HANDLER plsample_call_handler;

Normalmente, isto seria escrito no script de criação de uma extensão, e os usuários fariam o seguinte para instalar a extensão:

CREATE EXTENSION plsample;

Conformidade

O comando CREATE LANGUAGE é uma extensão do PostgreSQL.

Veja também

ALTER LANGUAGE, CREATE FUNCTION, DROP LANGUAGE, GRANT, REVOKE