Re: pregunta sobre trigger

Lists: pgsql-es-ayuda
From: Rafael Yordanis Rodríguez Montero <rafael(at)uci(dot)cu>
To: <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: pregunta sobre trigger
Date: 2007-11-01 15:42:12
Message-ID: 251EA6C55832BE4C80F868CC951BA8CE043BA613@ucixw2.uci.cu
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Hola amigos, tengo una pregunta que hacerles sobre un trigger que quisiera hacer, pero no estoy seguro si se pueda:

Tengo la siguiente tabla:

***************

PERSONA

***************

Idpersona

Nombre

Activo

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

Como ven, lo que quiero es detener el efecto de DELETE.

Puede esto hacerse?

Saludos a todos y desde ya agradecido.

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


From: Mario Jiménez Carrasco <mario(dot)carrasco(at)gmail(dot)com>
To: Rafael Yordanis Rodríguez Montero <rafael(at)uci(dot)cu>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: pregunta sobre trigger
Date: 2007-11-02 00:09:17
Message-ID: 1193962157.6504.1.camel@sds-jimenez.gateway.2wire.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda


El jue, 01-11-2007 a las 11:42 -0400, Rafael Yordanis Rodríguez Montero
escribió:
> Hola amigos, tengo una pregunta que hacerles sobre un trigger que quisiera hacer, pero no estoy seguro si se pueda:
>
> Tengo la siguiente tabla:
>
> ***************
>
> PERSONA
>
> ***************
>
> Idpersona
>
> Nombre
>
> Activo
>
> - 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.
>
> Como ven, lo que quiero es detener el efecto de DELETE.
>
> Puede esto hacerse?
>
> Saludos a todos y desde ya agradecido.

Pregunta....

¿Y por qué no hacer UPDATE directamente ?... digo, hacer solo un paso en
vez de dos...

saludos...


From: Miguel Rodríguez Penabad <penabad(at)gmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: pregunta sobre trigger
Date: 2007-11-02 08:53:23
Message-ID: 95335e4e0711020153m52dbab5frde3a1d2184d6e32b@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

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


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


From: "Danier Marante Jacas" <djacas(at)estudiantes(dot)uci(dot)cu>
To: <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Trabajo con cursores
Date: 2007-11-03 14:37:50
Message-ID: E0D3E288DC0E744DA293F341A2FF9278022E8186@ucixs78.uci.cu
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Yo tengo un cursor con el que recorro algunas tablas en una consulta. Pero necesito iterarlo con un siclo y abrirlo con un fecth para consultar la data que contiene. MI duda es si se puede cambiar la data del cursor o los campos de este. Otra duda que tengo es si puedo reiniciar un cursor con alguna función, es decir lo itero asta que encuentre lo que necesito y luego necesito itéralo de nuevo pero desde el inicio.

No se si me he explicado bien.

Agradezco de antemano la ayuda que me puedan brindar.

Saludos Danier Marante Jacas.


From: "Jaime Casanova" <systemguards(at)gmail(dot)com>
To: "Danier Marante Jacas" <djacas(at)estudiantes(dot)uci(dot)cu>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Trabajo con cursores
Date: 2007-11-05 04:04:20
Message-ID: c2d9e70e0711042004i380aa224t6b818b762508d92e@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

On 11/3/07, Danier Marante Jacas <djacas(at)estudiantes(dot)uci(dot)cu> wrote:
>
>
> Yo tengo un cursor con el que recorro algunas tablas en una consulta. Pero
> necesito iterarlo con un siclo y abrirlo con un fecth para consultar la data que
> contiene. MI duda es si se puede cambiar la data del cursor o los campos de
> este.

no entiendo... asignarle un select distinto al original? no creo...

> Otra duda que tengo es si puedo reiniciar un cursor con alguna función, es decir > lo itero asta que encuentre lo que necesito y luego necesito itéralo de nuevo
> pero desde el inicio.
>
>

MOVE FIRST FROM nombre_cursor;

--
Atentamente,
Jaime Casanova

"Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs and the universe trying
to produce bigger and better idiots.
So far, the universe is winning."
Richard Cook


From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Danier Marante Jacas <djacas(at)estudiantes(dot)uci(dot)cu>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Trabajo con cursores
Date: 2007-11-05 19:08:35
Message-ID: 20071105190835.GE6511@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Danier Marante Jacas escribió:
>
>
> Yo tengo un cursor con el que recorro algunas tablas en una consulta.
> Pero necesito iterarlo con un siclo y abrirlo con un fecth para
> consultar la data que contiene. MI duda es si se puede cambiar la data
> del cursor o los campos de este.

No. En 8.3 puedes hacer UPDATE WHERE CURRENT OF <cursor>, pero no
existe en las versiones estables. Suponiendo que te refieres a algo
asi:

alvherre=# create table foo (a serial);
NOTICE: CREATE TABLE creará una secuencia implícita «foo_a_seq» para la columna
serial «foo.a»
CREATE TABLE
alvherre=# insert into foo select * from generate_series (1, 10);
INSERT 0 10
alvherre=# begin;
BEGIN
alvherre=# declare test cursor for select * from foo;
DECLARE CURSOR
alvherre=# fetch 3 from test;
a
---
1
2
3
(3 filas)

alvherre=# update foo set a = a + 10 where current of test;
UPDATE 1
alvherre=# commit;
COMMIT
alvherre=# select * from foo;
a
----
1
2
4
5
6
7
8
9
10
13
(10 filas)

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.