CREATE LANGUAGE — define uma nova linguagem procedural
CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGEnomeHANDLERtratador_de_chamadas[ INLINEtratador_em_linha] [ VALIDATORfunção_validadora] CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGEnome
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.
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.
PROCEDURALEsta é uma palavra ruído.
nomeO 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.
É 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.
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;
O comando CREATE LANGUAGE é uma extensão do
PostgreSQL.