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

From: Pablo Braulio <brulics(at)gmail(dot)com>
To: "linder poclaba lazaro" <linder(dot)poclaba(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 08:34:09
Message-ID: 200605221034.10504.brulics@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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 La Pasion Del Rio 2006-05-22 10:08:07 Tipo de dato numerico 2 decimales
Previous Message Alvaro Herrera 2006-05-22 00:45:04 Re: Sobre autovacuum