Re: Escribir regla como un Trigger

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

jvenegasperu . escribió:

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

> > 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?

Seguro.

> > 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.

Ok.

> 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"

De QGIS no tengo idea.

> 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?.

No creo que la idea de quitar y poner restricciones sea operacionalmente
lo mejor. Considera la idea que te sugiero: en vez de que la aplicación
haga INSERT directamente, usa una función en plpgsql que tenga un bloque
algo así como

BEGIN
INSERT INTO ... ( ... )
EXCEPTION WHEN EXCLUSION_VIOLATION THEN
RAISE NOTICE 'no insertamos nada porque ya había algo';
RETURN NULL;
END

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

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alejandro Flores 2017-12-05 23:00:44 RE: Duda de información
Previous Message jvenegasperu . 2017-12-04 20:01:20 Re: Escribir regla como un Trigger