Creación de extensiones TLE para RDS para PostgreSQL - Amazon Relational Database Service

Creación de extensiones TLE para RDS para PostgreSQL

Puede instalar cualquier extensión que cree con TLE en cualquier instancia de base de datos de RDS para PostgreSQL que tenga la extensión pg_tle instalada. La extensión pg_tle se limita a la base de datos PostgreSQL en la que está instalada. Las extensiones que cree con TLE están incluidas en la misma base de datos.

Utilice las distintas funciones de pgtle para instalar el código que conforma la extensión TLE. Todas las siguientes funciones de Extensiones de lenguaje de confianza requieren el rol pgtle_admin.

Ejemplo: creación de una extensión de lenguaje de confianza mediante SQL

El siguiente ejemplo muestra cómo crear una extensión TLE denominada pg_distance que contenga algunas funciones SQL para calcular distancias mediante diferentes fórmulas. En la lista, puede encontrar la función para calcular la distancia Manhattan y la función para calcular la distancia euclidiana. Para obtener más información sobre la diferencia entre estas fórmulas, consulte Geometría del taxista y Geometría euclidiana en la Wikipedia.

Puede utilizar este ejemplo en su instancia de base de datos de RDS para PostgreSQL si tiene la extensión pg_tle configurada como se detalla en Configuración de Extensiones de lenguaje de confianza en su instancia de base de datos de RDS para PostgreSQL.

nota

Debe tener los privilegios del rol pgtle_admin para seguir este procedimiento.

Para crear la extensión TLE de ejemplo

En los pasos siguientes se utiliza un ejemplo de base de datos denominado labdb. Esta base de datos es propiedad del usuario postgres principal. El rol postgres también tiene los permisos del rol pgtle_admin.

  1. Use psql para conectarse a la Instancia de base de datos RDS para PostgreSQL.

    psql --host=db-instance-123456789012.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=labdb
  2. Cree una extensión TLE denominada pg_distance copiando el siguiente código y pegándolo en la consola de sesión de psql.

    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_$ );

    Debería ver un resultado como el siguiente.

    install_extension --------------- t (1 row)

    Los artefactos que componen la extensión pg_distance ahora ya están instalados en su base de datos. Estos artefactos incluyen el archivo de control y el código de la extensión, que son elementos que deben estar presentes para poder crear la extensión mediante el comando CREATE EXTENSION. En otras palabras, aún debe crear la extensión para que sus funciones estén disponibles para los usuarios de la base de datos.

  3. Para crear la extensión, utilice el comando CREATE EXTENSION como lo haría con cualquier otra extensión. Al igual que con otras extensiones, el usuario de la base de datos debe tener los permisos CREATE en la base de datos.

    CREATE EXTENSION pg_distance;
  4. Para probar la extensión TLE pg_distance, puede utilizarla para calcular la distancia Manhattan entre cuatro puntos.

    labdb=> SELECT manhattan_dist(1, 1, 5, 5); 8

    Para calcular la distancia euclidiana entre el mismo conjunto de puntos, puede utilizar lo siguiente.

    labdb=> SELECT euclidean_dist(1, 1, 5, 5); 5.656854249492381

La extensión pg_distance carga las funciones de la base de datos y las pone a disposición de cualquier usuario con permisos en la base de datos.

Modificación de su extensión TLE

Para mejorar el rendimiento de las consultas para las funciones incluidas en esta extensión TLE, añada los dos atributos de PostgreSQL siguientes a sus especificaciones.

  • IMMUTABLE: el atributo IMMUTABLE garantiza que el optimizador de consultas pueda utilizar optimizaciones para mejorar los tiempos de respuesta de las consultas. Para obtener más información, consulte Function Volatility Categories (Categorías de volatilidad de función) en la documentación de PostgreSQL.

  • PARALLEL SAFE: el atributo PARALLEL SAFE es otro atributo que permite a PostgreSQL ejecutar la función en modo paralelo. Para obtener más información, consulte CREATE FUNCTION en la documentación de PostgreSQL.

En el siguiente ejemplo, puede ver cómo se usa la función pgtle.install_update_path para agregar estos atributos a cada función a fin de crear una versión 0.2 de la extensión TLE pg_distance. Para obtener más información acerca de esta función, consulte pgtle.install_update_path. Debe tener el rol pgtle_admin para realizar esta tarea.

Para actualizar una extensión TLE existente y especificar la versión predeterminada
  1. Conecte con la instancia de base de datos de RDS para PostgreSQL con psql u otra herramienta de cliente como pgAdmin.

    psql --host=db-instance-123456789012.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=labdb
  2. Modifique una extensión TLE existente copiando el siguiente código y pegándolo en la consola de sesión de 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_$ );

    Verá una respuesta similar a la siguiente.

    install_update_path --------------------- t (1 row)

    Puede hacer que esta versión de la extensión sea la versión predeterminada para que los usuarios de la base de datos no tengan que especificar una versión al crear o actualizar la extensión en su base de datos.

  3. Para especificar que la versión modificada (versión 0.2) de la extensión TLE es la versión predeterminada, utilice la función pgtle.set_default_version tal como se muestra en el siguiente ejemplo.

    SELECT pgtle.set_default_version('pg_distance', '0.2');

    Para obtener más información acerca de esta función, consulte pgtle.set_default_version.

  4. Con el código en su lugar, puede actualizar la extensión TLE instalada de la forma habitual, mediante el comando ALTER EXTENSION ... UPDATE, tal como se muestra aquí:

    ALTER EXTENSION pg_distance UPDATE;