RE: pregunta sobre trigger

From: Rafael Yordanis Rodríguez Montero <rafael(at)uci(dot)cu>
To: Miguel Rodríguez Penabad <penabad(at)gmail(dot)com>, <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: pregunta sobre trigger
Date: 2007-11-02 15:29:41
Message-ID: 251EA6C55832BE4C80F868CC951BA8CE043BA616@ucixw2.uci.cu
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Garcias a todos por sus respuestas, en realidad ya lo había hecho usando UPDATE directamente, pero quería saber si en un mismo trigger yo podía anular su acción... La idea que me da Miguel de usar regla, al igual que la función+trigger me parece buena, pero bueno, me quedo usando el UPDATE directamente.
Gracias de nuevo colegas
Saludos y tengan un buen día.

_______________________________________
Ing. Rafael Yordanis Rodríguez Montero
Dpto. Ingeniería de Software
Universidad de las Ciencias Informáticas. Cuba
_______________________________________

________________________________

From: pgsql-es-ayuda-owner(at)postgresql(dot)org on behalf of Miguel Rodríguez Penabad
Sent: Fri 02/11/2007 4:53
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: [pgsql-es-ayuda] pregunta sobre trigger

> > - La cosa es que quiero un trigger que cuando yo llame la siguiente sentencia: DELETE FROM PERSONA WHERE Idpersona=1
> > en lugar de eliminar la persona indicada, lo que haga sea actualizar el campo activo al valor 0, es decir UPDATE.

>[Mario Jiménez Carrasco <mario(dot)carrasco(at)gmail(dot)com>]
> ¿Y por qué no hacer UPDATE directamente ?... digo, hacer solo un paso en
> vez de dos...

Aparte de coincidir con la pregunta de Mario....
Puedes resolverlo con una regla (rule) o con una función+trigger:
Ahí te va un ejemplo. Por cierto, ya que tenemos el tipo boolean, yo
no usaría el truco-chapuza-workaround-como_quieras_llamarlo de usar un
entero para eso.

create table persona(idpersona serial, nombre text, activo boolean);

CREATE RULE DELETE_A_UPDATE
AS ON DELETE
TO persona
DO INSTEAD
UPDATE persona SET ACTIVO = false
WHERE idpersona = OLD.idpersona;

Alternativa con un trigger:
Primero creamos la función
CREATE OR REPLACE FUNCTION borrado_a_modif()
RETURNS TRIGGER LANGUAGE plpgsql AS $$
BEGIN
UPDATE persona SET activo=false WHERE idpersona=OLD.idpersona;
RETURN NULL; -- importante! esto EVITA el delete
END
$$;

Y luego el trigger: DEBE ser BEFORE DELETE y FOR EACH ROW para que se pueda
evitar el borrado.
CREATE TRIGGER desactiva_no_borres
BEFORE DELETE ON persona FOR EACH ROW
EXECUTE PROCEDURE borrado_a_modif();

Saludos
--
Miguel Rodríguez Penabad
--
TIP 1: para suscribirte y desuscribirte, visita http://archives.postgresql.org/pgsql-es-ayuda

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Guillermo =?iso-8859-1?b?TXXxb3o=?= 2007-11-02 15:40:41 Re: NO funciona ADDNEW en postgresql - ADO - VB6
Previous Message Guillermo Muñoz 2007-11-02 14:50:41 Re: NO funciona ADDNEW en postgresql - ADO - VB6