Re: Regla sobre tabla

From: Juan Pablo Espino <jp(dot)espino(at)gmail(dot)com>
To: Jaime Casanova <systemguards(at)gmail(dot)com>
Cc: Pgsql-Es-Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Regla sobre tabla
Date: 2005-03-28 14:11:25
Message-ID: 3e7daec10503280611ef2e89@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola a todos

Siguiendo con el tema de las reglas, tengo otra duda, sería posible
escribir alguna funcion en C que pueda permitirme no caer en la
recursividad infinita, es que pues necesito que las reglas sean sobre
las mismas tablas a las que se les aplica un SELECT, DELETE, UPDATE o
INSERT. Por ejemplo tengo lo siguiente:
En esta tabla estan los usuarios de la base de datos y su nivel.
usuario nivel
"juan";5000
"pablo";4000
"corleone";3000
"publico";2000

Esta otra es una tabla normal que tiene una columna llamada nivel que
marca el nivel de cada registro o fila de la tabla.
mensaje nivel
"Mensaje para Ultra Secreto";5000
"Mensaje para Secreto";4000
"nuevo boo";3000
"nuevo boo";3000
"le hice una oferta que no pudo rechazar";2000
"mensaje publico";2000

Entonces por ejemplo pablo puede borrar o hacer update o ver (select)
a todos los registros menores o iguales a 4000. Originalmente lo que
hacia era una vista a la tabla y luego entonces creaba la regla
utilizando la vista para no caer en la recursividad infinita. Si
tienen alguna idea de como hacerlo sobre las mismas tablas sin tener
que crear vistas les agradeceria mucho el apoyo, saludos.

On Thu, 24 Mar 2005 09:35:40 -0500, Juan Pablo Espino
<jp(dot)espino(at)gmail(dot)com> wrote:
> Muchas gracias Jaime y Roberto.
>
>
> On Thu, 24 Mar 2005 01:41:27 -0500, Jaime Casanova
> <systemguards(at)gmail(dot)com> wrote:
> > On Wed, 23 Mar 2005 15:07:51 -0500, Juan Pablo Espino
> > <jp(dot)espino(at)gmail(dot)com> wrote:
> > > Que tal, saludos a todos.
> > >
> > > Me preguntaba si era posible aplicarle reglas a las tablas
> > > directamente, asi que intente lo siguiente.
> > >
> > > CREATE OR REPLACE RULE prueba AS
> > > ON DELETE TO journey DO INSTEAD DELETE FROM journey
> > > WHERE journey.anio = 2001;
> > >
> > > Ejecute las instrucciones y todo bien:
> > >
> > > Query returned successfully with no result in 130 ms.
> > >
> > >
> > > Bueno la tabla journey tiene dos columnas, disco y anio, entonces pues
> > > la regla debe eliminar solo la fila en donde journey.anio = 2001, pero
> > > lamentablemente parece que no es asi y este fue el resultado
> > >
> > > ERROR: infinite recursion detected in rules for relation "journey"
> > >
> > La regla dice cuando borre una fila en la tabla journey en su lugar
> > borre de la tabla journey (la misma tabla) los registros con anio =
> > 2001. Pero al ejecutarse la regla estas borrando registros, por lo
> > tanto se ejecuta la regla otra vez y asi sucesivamente hasta el
> > infinito. Postgres en vez de dejarte sufrir detecta esto y te lo
> > advierte, ese es el mensaje.
> >
> > > me gustaria saber por que sucede esto y si hay alguna forma de usar
> > > las reglas directamente sobre las tablas, esto es sin necesidad de
> > > crear una vista a la tabla, salduos y muchas gracias.
> > >
> > Si, pero no de la forma en que lo haces, imagina por ejemplo:
> >
> > CREATE OR REPLACE RULE prueba AS
> > ON DELETE TO journey DO INSTEAD
> > UPDATE journey set estado = 'E' WHERE journey.anio = 2001;
> >
> > De todas formas para hacer cosas asi puedes usar triggers, como
> > consejo te dire evita el sistema de reglas (por que no es Standard) a
> > menos que lo consideres la unica alternativa.
> >
> > atentamente,
> > Jaime Casanova
> >
>

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jose Ayala - INCALPACA TPX 2005-03-28 14:17:50 TRANSFORM plpgsql
Previous Message Leonardo Boet Sánchez 2005-03-28 13:47:48 RE: