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 12:59:40
Message-ID: 5aa69e1b0605220559h2e31d840y4d18488d9f4f6c5@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Linder Poclaba 2006-05-22 13:17:37 dar formato de salida al tiempo
Previous Message Alfredo Ramirez 2006-05-22 12:16:02 Re: Problema al instalar en Ubuntu