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.
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.
Después creamos una tabla con el nombre parcelas con los campos necesarios (identificador y área) e indicamos el SRC para la misma.
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.
Si desplegamos el listado Trigger Functions podemos comprobar que se ha creado correctamente la nueva función disparadora:
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();
Si desplegamos la sección Triggers de la tabla parcelas, comprobamos que la creación del trigger ha tenido éxito:
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.
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!.
Tutor de los cursos de QGIS, QGIS avanzado, QGIS aplicado a Urbanismo y Catastro, PostGIS, Teledetección con QGIS y Google Earth Engine, PostGIS y ArcGIS. Licenciado en Geografía y Master en SIG y Ordenación del Territorio. Echa un vistazo a todos nuestros cursos de SIG online.
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!
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.