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 13:22:01 |
Message-ID: | 5aa69e1b0605220622n6be61c41r2a627703dd7ea585@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
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;
>
>
> On 5/22/06, Pablo Braulio <brulics(at)gmail(dot)com> wrote:
> > El Domingo, 21 de Mayo de 2006 23:10, linder poclaba lazaro escribió:
> > > Hola Pablo bueno esta viendo tu pregunta y creo que deberias hacer
> algunas
> > > modificaciones:
> > >
> > > IF (SELECT max(id) FROM fechas_personal WHERE empleado = OLD.empleado)
> !=
> > > OLD.id THEN
> > > RAISE NOTICE 'Existen fechas posteriores. No se puede borrar
> > > registro.';
> > > RETURN NULL;
> > > ELSE
> > > RETURN OLD;
> > > END IF;
> > >
> > > No olvides que es una funcion y tienes que retornar algo, los triggers
> a
> > > nivel renglon lanzados antes o before pueden devolver null, para
> avisar
> > al
> > > administrador de triggers que debe saltar el resto de las operaciones
> para
> > > este renglon.
> >
> > Gracias. No tengo todavía muy claro en que casos debería retornar NEW,
> OLD,
> > NULL.
> >
> > He cambiado el diseño de la función, pues necesito hacer mas de una
> > operación
> > en BEFORE DELETE.
> >
> > Esto es lo que tengo hecho de momento.
> >
> > En una tabla PERSONAL, se insertan los datos de los empleados, y con un
> > trigger al insertar un dato se inserta otro en la tabla FECHAS_PERSONAL,
> con
> > la fecha de alta.
> >
> > \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) |
> > Restricciones de llave foránea:
> > «fechas_personal_empleado_fkey» FOREIGN KEY (empleado) REFERENCES
> > personal(id) ON UPDATE CASCADE ON DELETE CASCADE
> >
> > .....
> >
> > Lo que trato de hacer es controlar que no se borren todas las líneas de
> esta
> > última tabla. Para eso he creado este trigger:
> >
> > CREATE OR REPLACE FUNCTION checkBorrarFechas() RETURNS TRIGGER AS $$
> > BEGIN
> > IF (select count(*) from fechas_personal where empleado =
> OLD.empleado) = 1
> > THEN
> > RAISE EXCEPTION 'No se puede borrar todas las fechas.';
> > RETURN OLD;
> > END IF;
> > END;
> > $$ language plpgsql;
> > CREATE TRIGGER checkBorrarFechas BEFORE DELETE ON fechas_personal FOR
> EACH
> > ROW
> > EXECUTE PROCEDURE checkBorrarFechas();
> >
> > Pero el problema es que al hacer DELETE en la tabla PERSONAL, no me deja
> > borrar nada en esta última tabla. Supongo que por la restricción que le
> > aplico en el trigger.
> >
> > Había pensado en poner dentro de la función esta condición:
> >
> > IF (select count(*) from personal where id = OLD.empleado) = 0
> > THEN
> > DELETE FROM fechas_personal where empleado = OLD.empleado;
> > RETURN OLD;
> > END IF;
> >
> > Pero no funciona.
> >
> > ¿Se puede hacer esto de alguna forma?.
> >
> > Gracias por la ayuda y paciencia.
> > --
> > Saludos.
> > Pablo.
> >
>
From | Date | Subject | |
---|---|---|---|
Next Message | Leonel Nunez | 2006-05-22 13:26:43 | Re: Problema al instalar en Ubuntu |
Previous Message | Linder Poclaba | 2006-05-22 13:17:37 | dar formato de salida al tiempo |