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 Capítulo 57 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