Cómo crear y ejecutar un disparador o «trigger» en PostGIS

Inicio_disparador_trigger

En el manejo recurrente de actualización de datos en tablas en una base de datos espacial PostGIS, en ocasiones necesitamos realizar tareas repetitivas y tediosas que, si se automatizasen, nos liberarían de esfuerzo innecesario con la consiguiente optimización del tiempo de trabajo. Por ejemplo:

  • Cuando es necesario controlar los valores de los campos, evitando que se tomen valores concretos.
  • Duplicar valores de una tabla en tiempo real.
  • Introducir restricciones en determinados campos con determinados valores.
  • Crear un auto id o identificador.
  • Controlar la modificación de los valores de los campos.
  • Ejecutar actualizaciones en cascada.

Estas rutinas periódicas y recurrentes realmente sí pueden automatizarse mediante la creación de un disparador o trigger.

En el presente tutorial vamos a explicarte qué es un trigger y cómo crearlo y ejecutarlo aplicado a PostGIS.

¿Qué es un trigger?

Un disparador o trigger es una funcionalidad que la base de datos ejecuta de forma automática cuando se realiza una operación de tipo Insert, Update o Delete en una tabla o vista, o cuando se ejecuta una consulta SQL sobre una tabla o vista.

Esto nos permite realizar acciones cuando se realiza una inserción, modificación o eliminación de un registro.

trigger

Dicha funcionalidad se plasma mediante una función, la cual se llama función disparadora, que se ejecuta cada vez que PostgreSQL actúa sobre una fila (disparador de fila o de tipo for each row) o una única vez por sentencia SQL (disparador de secuencia o de tipo for each statement).

La creación de un disparador o trigger se realiza en dos pasos:

  • En primer lugar, se crea la función disparadora.
  • En segundo lugar, se crea el propio disparador SQL con el comando CREATE TRIGGER al que introduciremos los parámetros para ejecutar la función disparadora creada en el paso anterior.

En el presente tutorial creamos un disparador que mantiene actualizados los campos id (identificador) y área de una capa de parcelas con los valores correspondientes de la geometría geom.

Para ello, en primer lugar, creamos una base de datos y la dotamos de capacidades espaciales.

create_extension_postgis

Después creamos una tabla con el nombre parcelas con los campos necesarios (identificador y área) e indicamos el SRC para la misma.

create_table

Creación de la función disparadora

En Pl/Pgsql una función disparadora se crea con el comando SQL CREATE FUNCTION sin argumentos y que devuelve un tipo de datos trigger (RETURNS trigger), mientras que los argumentos del disparador son pasados mediante la variable TG_ARGV (creando un array con los argumentos pasados desde la sentencia Create Trigger).

El siguiente paso sería crear la función disparadora:

CREATE OR REPLACE FUNCTION funcion_area_perimetro () RETURNS trigger AS
$$
BEGIN
      RAISE NOTICE  'función disparadora, acción = %, sobre fila gid = %', TG_OP,
       NEW.gid;
       NEW.area = ST_area   (NEW.geom);
       RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';

En la función hemos definido que, una vez se inserte una nueva geometría se actualicen los campos identificador (gid) y área de forma automática, para ello emplearemos la función ST_Area.

Además hemos indicado que la interfaz arroje un mensaje (RAISE NOTICE) indicando el tipo de acción y el identificador de la fila actualizada.

funcion_disparadora

Si desplegamos el listado Trigger Functions podemos comprobar que se ha creado correctamente la nueva función disparadora:

trigger_functions_pgadmin

Creación del disparador o trigger

Una vez tenemos la función disparadora es el momento de crear el disparador.

La sintaxis de la definición de un disparador o trigger es:

CREATE TRIGGER nombreDisparador { BEFORE | AFTER } { evento [ OR…] }

ON nombreTabla [FOR [EACH] {ROW | STATEMENT }  ] EXECUTE

PROCEDURE nombreFuncionDisparadora (argumentos)

Donde evento es la acción bajo la cual se ejecuta el disparador (sólo tiene sentido si es un disparador de fila) y puede tomar los valores: Insert, Update, Delete o Truncate. El parámetro argumentos convierte los argumentos especificados a una variable de tipo TG_ARGV[] accesible por la función disparadora.

Nuestro disparador quedaría de la siguiente forma:

CREATE TRIGGER area_perimetro_trigger

BEFORE INSERT OR UPDATE ON parcelas

FOR EACH ROW EXECUTE

PROCEDURE funcion_area_perimetro();

create_trigger

Si desplegamos la sección Triggers de la tabla parcelas, comprobamos que la creación del trigger ha tenido éxito:

trigger_table_pgadmin

Por último, ya sólo nos quedaría introducir las geometrías de las parcelas deseadas dentro de la tabla y, automáticamente, aparecerán calculados los campos identificador (gid) y area.

insert_data

Si quieres aprender más o tienes dudas de cómo crear y ejecutar un trigger, inscríbete ya en nuestro Curso Online en Bases de Datos Espaciales PostGIS, ¡hay pocas plazas!.

2 comentarios en «Cómo crear y ejecutar un disparador o «trigger» en PostGIS»

  1. Hola Javier,

    Si quieres trabajar con pgRouting en PostGIS puedes emplear la versión 2.1.8, ya que en la versión 2.2 hemos comprobado errores en la ejecución de alguna función.

    Por otro lado, en cuanto a la versión de PostgreSQL, no es recomendable emplear versiones Beta, por lo que puedes trabajar con la versión 9.4.8 o 9.5.3 sin problemas.

    Un saludo!

  2. Buenas!
    Buenísima la info sirve un muchísimo. Me serviría para el trabajo que estoy haciendo ahora. Vamos a probar.

    Les hago una consulta tengo una Base PostGis 1.4 y queremos cambiar todo. Que versiones de PostgreSQL y postgis recomiendan para este tipo de trabajo, ademas que no pierda compatibilidad con pgrountig?
    Gracias.

Los comentarios están cerrados.