Re: Función para controla un campo de la última fila.

From: "Linder Poclaba" <linder(dot)poclaba(at)gmail(dot)com>
To: "Pablo Braulio" <brulics(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Función para controla un campo de la última fila.
Date: 2006-05-22 14:48:06
Message-ID: 5aa69e1b0605220748t6ab2569cjad2672dfbea909a8@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

No soluciona tu problema puesto que pusiste una restriccion "ON DELETE
CASCADE" sobre el campo empleado y esta restriccion borra automaticamente
todas la tuplas referenciadas en la tabla fechas_personal, lo cual esta
activando el trigger que esta en fechas_personal que no deja borrar todas la
tuplas para el empleado X.

On 5/22/06, Pablo Braulio <brulics(at)gmail(dot)com> wrote:
>
> El Lunes, 22 de Mayo de 2006 15:22, Linder Poclaba escribió:
> > solo te faltaba retornar null cuando solo exista 1 tupla para ese
> empleado
> > en fechas_personal :) perdon me falta mencionar eso.
> >
> > On 5/22/06, Linder Poclaba <linder(dot)poclaba(at)gmail(dot)com> wrote:
> > > Lo que vos quieres es que no se borren todas las filas de cada
> > > empleado que quede por lo menos una en la tabla fechas_personal
> > > cierto? si es así esta bien tu restricción.
> > >
> > > IF (select count(*) from fechas_personal where empleado = OLD.empleado)
> =
> > > 1 THEN
> > > RAISE EXCEPTION 'No se puede borrar todas las fechas.';
> > > RETURN NULL;
> > > ELSE
> > > RETURN OLD;
> > > END IF;
>
> Pero no soluciona el problema.
>
> La tabla FECHAS_PERSONAL tiene esta estructura:
>
> \d fechas_personal
> Tabla «public.fechas_personal»
> Columna | Tipo | Modificadores
>
> ------------+-----------------------+--------------------------------------------------------------
> id | integer | not null default
> nextval('fechas_personal_id_seq'::regclass)
> empleado | integer | not null
> alta | date | not null
> baja | date |
> comentario | character varying(50) |
> Índices:
> «fechas_personal_pkey» PRIMARY KEY, btree (id)
> Restricciones CHECK:
> «fechas_personal_check» CHECK (alta <= baja)
> Restricciones de llave foránea:
> «fechas_personal_empleado_fkey» FOREIGN KEY (empleado) REFERENCES
> personal(id) ON UPDATE CASCADE ON DELETE CASCADE
>
> Como puedes ver el campo EMPLEADO es FOREIGN KEY del campo ID en PERSONAL.
>
> Por lo que al hacer un DELETE en la tabla PERSONAL, debería borrar datos
> en
> FECHAS_PERSONAL. Pero esto es lo que ocurre con el trigger puesto:
>
> # DELETE FROM personal WHERE id = 2146;
> ERROR: No se puede borrar todas las fechas.
> CONTEXT: sentencia SQL: «DELETE FROM ONLY "public"."fechas_personal"
> WHERE "empleado" = $1»
>
> La restricción funciona, pero no como deseo.
>
> Si se aplica un DELETE en PERSONAL, necesito que borre los datos en
> FECHAS_PERSONAL.
>
> Gracias de todos modos por el comentario.
> --
> Saludos.
> Pablo.
>

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Dimas Ayala 2006-05-22 14:55:18 Re: TRIGGERS y VFP bajan la performance
Previous Message Pablo Braulio 2006-05-22 13:48:04 Re: Función para controla un campo de la última fila.