Criar extensões TLE para RDS para PostgreSQL
Você pode instalar qualquer extensão criada com o TLE em qualquer instância de banco de dados do RDS para PostgreSQL que tenha a extensão pg_tle instalada. A extensão pg_tle tem como escopo o banco de dados PostgreSQL no qual ela está instalada. As extensões que você cria usando o TLE têm como escopo o mesmo banco de dados.
Use as várias funções pgtle para instalar o código que compõe sua extensão TLE. As funções do Trusted Language Extensions a seguir exigem a função pgtle_admin.
Exemplo: Criar uma extensão de linguagem confiável usando SQL
O exemplo a seguir mostra como criar uma extensão TLE chamada pg_distance que contém algumas funções SQL para calcular distâncias usando fórmulas diferentes. Na lista, você pode encontrar a função para calcular a distância de Manhattan e a função para calcular a distância euclidiana. Para obter mais informações sobre a diferença entre essas fórmulas, consulte Geometria taxicab
Você poderá usar esse exemplo em sua própria instância de banco de dados do RDS para PostgreSQL se tiver a extensão pg_tle configurada conforme detalhado em Configurar o Trusted Language Extensions em sua instância de banco de dados do RDS para PostgreSQL.
nota
Você precisa ter os privilégios da função pgtle_admin para seguir esse procedimento.
Como criar o exemplo de extensão TLE
As etapas a seguir usam um exemplo de banco de dados chamado labdb. Esse banco de dados é de propriedade do usuário primário postgres. A função postgres também tem as permissões da função pgtle_admin.
Use o
psqlpara se conectar à Instância de banco de dados do RDS para PostgreSQL.psql --host=db-instance-123456789012.aws-region.rds.amazonaws.com --port=5432--username=postgres--password --dbname=labdbCrie uma extensão TLE denominada
pg_distancecopiando o código a seguir e colando-o no console da sessãopsql.SELECT pgtle.install_extension ( 'pg_distance', '0.1', 'Distance functions for two points', $_pg_tle_$ CREATE FUNCTION dist(x1 float8, y1 float8, x2 float8, y2 float8, norm int) RETURNS float8 AS $$ SELECT (abs(x2 - x1) ^ norm + abs(y2 - y1) ^ norm) ^ (1::float8 / norm); $$ LANGUAGE SQL; CREATE FUNCTION manhattan_dist(x1 float8, y1 float8, x2 float8, y2 float8) RETURNS float8 AS $$ SELECT dist(x1, y1, x2, y2, 1); $$ LANGUAGE SQL; CREATE FUNCTION euclidean_dist(x1 float8, y1 float8, x2 float8, y2 float8) RETURNS float8 AS $$ SELECT dist(x1, y1, x2, y2, 2); $$ LANGUAGE SQL; $_pg_tle_$ );Você verá a saída da forma a seguir.
install_extension --------------- t (1 row)Os artefatos que compõem a extensão
pg_distanceagora estão instalados em seu banco de dados. Esses artefatos incluem o arquivo de controle e o código da extensão, que são itens que precisam estar presentes para que a extensão possa ser criada usando o comandoCREATE EXTENSION. Em outras palavras, você ainda precisa criar a extensão para disponibilizar suas funções aos usuários do banco de dados.Para criar a extensão, use o comando
CREATE EXTENSIONcomo você faz com qualquer outra extensão. Assim como acontece com outras extensões, o usuário do banco de dados precisa ter as permissõesCREATEno banco de dados.CREATE EXTENSION pg_distance;Para testar a extensão TLE
pg_distance, você pode usá-la para calcular a distância de Manhattanentre quatro pontos. labdb=>SELECT manhattan_dist(1, 1, 5, 5);8Para calcular a distância euclidiana
entre o mesmo conjunto de pontos, você pode usar o seguinte. labdb=>SELECT euclidean_dist(1, 1, 5, 5);5.656854249492381
A extensão pg_distance carrega as funções no banco de dados e as disponibiliza para qualquer usuário com permissões no banco de dados.
Modificar a extensão TLE
Para melhorar a performance da consulta para as funções empacotadas nessa extensão TLE, adicione os dois atributos do PostgreSQL a seguir às suas especificações.
IMMUTABLE: o atributoIMMUTABLEgarante que o otimizador de consultas possa usar otimizações para melhorar os tempos de resposta da consulta. Para obter mais informações, consulte Function Volatility Categories(Categorias de volatilidade de funções) na documentação do PostgreSQL. PARALLEL SAFE: o atributoPARALLEL SAFEé outro atributo que permite que o PostgreSQL execute a função no modo paralelo. Para obter mais informações, consulte CREATE FUNCTIONna documentação do PostgreSQL.
No exemplo a seguir, você pode ver como a função pgtle.install_update_path é usada para adicionar esses atributos a cada função para criar uma versão 0.2 da extensão TLE pg_distance. Para ter mais informações sobre essa função, consulte pgtle.install_update_path. Você precisa ter a função pgtle_admin para realizar essa tarefa.
Como atualizar uma extensão TLE existente e especificar a versão padrão
Conecte-se à instância de banco de dados do RDS para PostgreSQL usando
psqlou outra ferramenta de cliente, como o pgAdminpsql --host=db-instance-123456789012.aws-region.rds.amazonaws.com --port=5432--username=postgres--password --dbname=labdbModifique a extensão TLE existente copiando o código a seguir e colando-o no console da sessão
psql.SELECT pgtle.install_update_path ( 'pg_distance', '0.1', '0.2', $_pg_tle_$ CREATE OR REPLACE FUNCTION dist(x1 float8, y1 float8, x2 float8, y2 float8, norm int) RETURNS float8 AS $$ SELECT (abs(x2 - x1) ^ norm + abs(y2 - y1) ^ norm) ^ (1::float8 / norm); $$ LANGUAGE SQL IMMUTABLE PARALLEL SAFE; CREATE OR REPLACE FUNCTION manhattan_dist(x1 float8, y1 float8, x2 float8, y2 float8) RETURNS float8 AS $$ SELECT dist(x1, y1, x2, y2, 1); $$ LANGUAGE SQL IMMUTABLE PARALLEL SAFE; CREATE OR REPLACE FUNCTION euclidean_dist(x1 float8, y1 float8, x2 float8, y2 float8) RETURNS float8 AS $$ SELECT dist(x1, y1, x2, y2, 2); $$ LANGUAGE SQL IMMUTABLE PARALLEL SAFE; $_pg_tle_$ );Você verá uma resposta semelhante ao seguinte.
install_update_path --------------------- t (1 row)Você pode tornar essa versão da extensão a versão padrão, para que os usuários do banco de dados não precisem especificar uma versão ao criar ou atualizar a extensão em seu banco de dados.
Para especificar que a versão modificada (versão 0.2) de sua extensão TLE é a versão padrão, use a função
pgtle.set_default_versionconforme mostrado no exemplo a seguir.SELECT pgtle.set_default_version('pg_distance', '0.2');Para ter mais informações sobre essa função, consulte pgtle.set_default_version.
Com o código implementado, você pode atualizar a extensão TLE instalada da maneira usual, utilizando o comando
ALTER EXTENSION ... UPDATE, conforme mostrado aqui:ALTER EXTENSION pg_distance UPDATE;