Idea para el desarrollo de Funcion trigger AFTER INSERT

From: Marcos Luis Ortiz Valmaseda <marcosluis2186(at)gmail(dot)com>
To: Lista PostgreSql <pgsql-es-ayuda(at)postgresql(dot)org>
Cc: Yosvany Arrastia Machin <mikillo07(at)gmail(dot)com>, Yudiel La Rosa Gonzalez <ylarosag(at)gmail(dot)com>
Subject: Idea para el desarrollo de Funcion trigger AFTER INSERT
Date: 2013-06-11 15:37:56
Message-ID: CAJs-K1up17RnDY=3v2OfrMf8psM9Pt3qSvj9z38aod7aUkcEFg@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Primero toda la información:

SELECT version();
version

-------------------------------------------------------------------------------------------------------
PostgreSQL 9.2.4 on x86_64-unknown-linux-gnu, compiled by gcc-4.4.real
(Debian 4.4.5-8) 4.4.5, 64-bit
(1 row)

Sistema Operativo: Debian GNU/Linux 6.0.6

La base de datos cuenta con 69 tablas, pero las que nos interesan en este
caso son las tablas llamadas issues, custom_fields y custom_values.

La relación entre estas dos tablas es que a la vez que se inserta una
issue, los valores como tal de esa issue, se insertan en la tabla
custom_values, lo cual se basa en el modelo Entidad-Atributo-Valor.
Entonces, una de los campos de la issue que se almacena en la tabla
custom_fields es el No. de Procedimiento, que es un text, generado a partir
de funciones. Pero que pasa, acá, que nosotros queremos que a partir de la
inserción de una issue, actualizar el valor de dicho No. de Procedimiento
en custom_values.

Ya creamos la función trigger que ejecuta todo ello, y el trigger
condicional en la tabla issues, con la siguiente definición:

----------------------------------------------------------------------------------------------------------------------------------------
CREATE OR REPLACE FUNCTION trigger_issues_insert_procedimiento()
RETURNS trigger AS
$BODY$
BEGIN
IF (TG_OP = 'INSERT') THEN
PERFORM insert_sequence_comision(NEW.id, NEW.project_id);
RETURN NEW;
ELSIF (TG_OP = 'UPDATE' ) THEN
PERFORM insert_sequence_comision(NEW.id, NEW.project_id);
RETURN NEW;
ELSE
RAISE WARNING 'Ocurrio otra accion';
END IF;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION trigger_issues_insert_procedimiento()
OWNER TO postgres;
GRANT EXECUTE ON FUNCTION trigger_issues_insert_procedimiento() TO public;
GRANT EXECUTE ON FUNCTION trigger_issues_insert_procedimiento() TO postgres;

---------------------------------------------------------------------------------------------------------------------------------------

CREATE TRIGGER insert_issues_procedimiento
BEFORE UPDATE OF status_id
ON issues
FOR EACH ROW
WHEN (((new.status_id = 17) AND ((((((((((((((((new.tracker_id = 49) OR
(new.tracker_id = 50)) OR (new.tracker_id = 27)) OR (new.tracker_id = 52))
OR (new.tracker_id = 51)) OR (new.tracker_id = 35)) OR (new.tracker_id =
19)) OR (new.tracker_id = 20)) OR (new.tracker_id = 21)) OR (new.tracker_id
= 36)) OR (new.tracker_id = 37)) OR (new.tracker_id = 38)) OR
(new.tracker_id = 59)) OR (new.tracker_id = 60)) OR (new.tracker_id = 61))
OR (new.tracker_id = 62))))
EXECUTE PROCEDURE trigger_issues_insert_procedimiento();

---------------------------------------------------------------------------------------------------------------------------------------------
CREATE OR REPLACE FUNCTION insert_sequence_comision(integer, integer)
RETURNS void AS
$BODY$
DECLARE
v_issue_id ALIAS FOR $1;
v_project_id ALIAS FOR $2;
v_sequence meta.sequences.uc_sequence%TYPE;
v_procedimiento custom_values.value%TYPE;
v_year integer;
v_result text;
BEGIN
v_year := EXTRACT(YEAR FROM NOW())::INTEGER;
-- Se obtiene el valor de la secuencia x por el id de unidad contratante
SELECT uc_sequence
INTO v_sequence
FROM meta.sequences
WHERE meta.sequences.uc_id = v_project_id
AND meta.sequences.year = v_year;

-- Se obtiene el valor del no. de procedimiento en la tabla custom_values
a partir de los id de la issue y custom_field_id = 2
SELECT custom_values.value INTO v_procedimiento FROM custom_values WHERE
custom_values.customized_id = v_issue_id AND custom_values.custom_field_id
= 2;
v_sequence := v_sequence + 1;
UPDATE meta.sequences SET uc_sequence = v_sequence WHERE uc_id =
v_project_id AND year = v_year;
IF (v_sequence BETWEEN 0 AND 9) THEN
v_result := v_procedimiento ||'000' || v_sequence;
ELSIF (v_sequence BETWEEN 10 AND 99) THEN
v_result := v_procedimiento ||'00' || v_sequence;
ELSIF (v_sequence BETWEEN 100 AND 999) THEN
v_result := v_procedimiento ||'0' || v_sequence;
ELSE
v_result := v_procedimiento || v_sequence;
END IF;
UPDATE custom_values SET value = v_result WHERE customized_id =
v_issue_id AND custom_field_id = 2;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION insert_sequence_comision(integer, integer)
OWNER TO postgres;
GRANT EXECUTE ON FUNCTION insert_sequence_comision(integer, integer) TO
public;
GRANT EXECUTE ON FUNCTION insert_sequence_comision(integer, integer) TO
postgres;

¿Cuál es el problema en sí?
Que el sistema el cual estamos desarrollando, la inserción ocurre primero
en issues, y luego ocurre en custom_values, y entonces, cuando se llama el
trigger, todavía el id de la issue no se encuentra en custom_values, por lo
que nos gustaría que nos pudieran sugerir una idea al respecto. La idea es
ejecutar la función de actualización del No. de procedimiento luego de que
sea hagan ambas inserciones en issues y en custom_values.

La solución más fácil es hacer un trigger en custom_values, pero no es la
idea, por el hecho de que dicha tabla es la más crítica de la aplicación, y
además, las condiciones por las cuales se ejecuta el trigger, que son los
trackers_id (que son los que definen los tipos de issue es cada uno), no se
encuentran almancedos en custom_values, sino en otra tabla llamada
issues_trackers, por lo que sería más costoso buscar todas estas
operaciones, cada vez que se vaya a insertar un issue del tipo que nos
interesa en este caso.

Saludos y quedamos al tanto.

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alejandro Brust at federacion 2013-06-11 16:03:04 Re: migracion PG9.0 a 9.2 problemas con apostrofes y demas caracteres
Previous Message Eduardo Morras 2013-06-11 15:28:32 Re: migracion PG9.0 a 9.2 problemas con apostrofes y demas caracteres