Re: Escribir regla como un Trigger

From: "jvenegasperu (dot)" <jvenegasperu(at)gmail(dot)com>
To: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
Cc: Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Escribir regla como un Trigger
Date: 2017-12-04 20:01:20
Message-ID: CA+KjtGcDo-MOFfiuYT9nsw_U3_orYOv0SJON9SfgkAzj2U2=zA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Gracias por responder tan pronto les comento entre lineas

El 4 de diciembre de 2017, 13:42, Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
escribió:

> jvenegasperu . escribió:
>
> > Si yo uso la regla usando pgadmin funciona bien y no me permite insertar
> > una nueva geometria de tipo punto cuando se trata de las mismas
> coordenadas.
> >
> > Esta es la regla
> >
> > CREATE OR REPLACE RULE ed_ap_valvula AS
> > ON INSERT TO ap_valvula
> > WHERE 0 <> (( SELECT count(*) AS count
> > FROM ap_valvula
> > WHERE ap_valvula.the_geom ~= new.the_geom))
> > DO INSTEAD NOTHING;
>
> Lo que realmente te hace falta, creo, es una restriccion EXCLUDE, que
> debería ser algo así:
>
> ALTER TABLE ap_valvula ADD CONSTRAINT no_misma_geom
> EXCLUDE (the_geom WITH ~=);
>
> Quizás alguien pueda proveer un ejemplo más completo (yo no tengo
> postgis disponible aquí); pero la idea es que no usas triggers ni reglas
> sino que la restricción misma se hace cargo del problema.
>

Alvaro es posible que la restriccion use menos recursos y por ende sea una
solución mas optima?

> Ahora, tu regla no *impide* que se inserte el objeto (yo esperaría que
> eso arrojara un error), sino que más bien no inserta nada cuando el
> insert va a una geometría donde ya hay un objeto. Usando EXCLUDE va a
> arrojar un error.

Tienes razon Alvaro la razon por la que la regla solo devolvia Null era
porque yo la usaba cuando migraba datos en batch y eran miles y a mi
simplemente me interesaba que no se dupliquen sin avisar del error
simplemente se descartaban duplicados.
Usandola desde QGIs estaba funcionando bien hasta que en la version 2.18.
dejo de funcionar enviando el error

"Necesita un regla incondicional ON INSERT DO INSTEAD con una cláusula
RETURNING"

Eso me lleva a pensar que si implemento la restricción y despues quiero
importar datos tendre que quitarla temporalmente porque la excepcion
paralizaria el trabajo?.

> Pero podrías atraparlo usando plpgsql y un bloque
> exception, que de todas formas va a ser más simple de implementar que
> una regla o un trigger ...
>

y con respecto a esto de atrapar el error se puede poner un mensaje para
devolver al momento de crear la restriccion para que sea eso lo que se
muestre en la vista de mensajes de QGis en lugar del mensaje por defecto?

saludos

>
> --
> Álvaro Herrera https://www.2ndQuadrant.com/
> PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
>

--
José Mercedes Venegas Acevedo
cel Mov RPC 964185205

Member of the PHP Documentation Group (Spanish)

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2017-12-04 20:18:03 Re: Escribir regla como un Trigger
Previous Message Alvaro Herrera 2017-12-04 18:42:29 Re: Escribir regla como un Trigger