Triggers

Páginas: 5 (1046 palabras) Publicado: 11 de noviembre de 2012
Ejemplos de Trigger
Tenemos una tabla de archivos (llamada archivos), en la que uno de los campos es un MD5 sobre el contenido del archivo (campo llamado dmd5). En una tabla anexa (llamada aux), necesitamos llevar la cuenta de cuántos registros tenemos con el mismo MD5, para esto tenemos dos campos: dmd5 y cont. Así, cada vez que insertamos un registro en archivos debemos de actualizar elcontador correspondiente en aux. De igual manera, cuando borramos un registro de archivos, deberemos de decrementar el contador correspondiente en aux y en caso de que sea el único, eliminar el registro.
Obviamente esto se puede hacer desde el mismo programa de actualización, pero resulta, y es este caso en particular lo que motivó el empleo de triggers, que son varios programas los que actualizanesta tabla, así que mantener cada uno de ellos se vuelve un tanto cuanto engorroso. La mejor solución es emplear triggers. Cabe señalar que el ejemplo que se muestra a continuación funciona sólo de la versión de PostgreSQL 6.5.3 en adelante, dado que emplea el Procedure Language PL/pgSQL y algunas particularidades integradas a partir de esa versión.
Bueno, el código para actualizar los valores esel siguiente:
DROP FUNCTION inc_aux ();
CREATE FUNCTION inc_aux () RETURNS OPAQUE AS '
DECLARE
myrec record;
BEGIN
SELECT * INTO myrec FROM aux WHERE aux.dmd5 = NEW.dmd5;
IF NOT FOUND THEN
INSERT INTO aux VALUES (NEW.dmd5, 1);ELSE
UPDATE aux SET cont=cont+1 WHERE dmd5 = NEW.dmd5;
END IF;
RETURN NEW;
END;
' LANGUAGE 'plpgsql';
DROP TRIGGER ins_arc ON archivos;
CREATE TRIGGER ins_arc BEFORE INSERT ON archivos FOR EACH ROW
EXECUTE PROCEDURE inc_aux();Los DROPs antes de crear la función y el trigger, son para garantizar que las funciones no existen previamente y sobre todo, porque tuve que hacer un demonial de pruebas antes de que la cosa jalara.
Recordemos que los triggers no pueden recibir argumentos y siempre tienen que regresar un valor opaco.
El select se hace para averiguar si existe un registro con el MD5 y en caso de no existir lo insertamoscon el contador en uno y en caso de que ya exista, incrementamos el contador en uno. Muy simple. Sólo es de notar que tuvimos que declarar un registro para hacer la consulta y saber si el registro existe en la tabla anexa para actualizarlo (update) o si será necesario crear uno nuevo (insert). El registro NEW se refiere al registro con que el que fué disparado el trigger.
Eliminamosel trigger para, en caso de que ya exista uno con el mismo nombre, garantizar que se ejecutará el que vamos a declarar. Como podemos ver, los triggers están asociados a tablas y por eso se debe de indicar de que tabla lo eliminamos al momento de efectuar el drop.
Ahora veamos el caso en que se eliminan registros. Por supuesto, en este caso estamos eliminando un registro que está en la base, así que nonecesitamos ver primero si existe. El único considerando a tomar en cuenta es el caso en que el MD5 es único, en cuyo caso habremos de eliminar de la tabla dmd5 el registro.
DROP FUNCTION dec_aux ();
CREATE FUNCTION dec_aux () RETURNS OPAQUE AS '
BEGIN
UPDATE aux SET cont=cont-1 WHERE dmd5 = OLD.dmd5;
DELETEFROM aux where cont < 1;
RETURN NULL;
END;
' LANGUAGE 'plpgsql';
DROP TRIGGER del_arc ON archivos;
CREATE TRIGGER del_arc AFTER DELETE ON archivos
FOR EACH ROW EXECUTE PROCEDURE dec_aux();
Una manera de probarlo, es la siguiente:
mancha=> SELECT * FROM aux WHERE...
Leer documento completo

Regístrate para leer el documento completo.

Estos documentos también te pueden resultar útiles

  • Triggers
  • TRIGGERS
  • Triggers
  • Triggers
  • Triggers
  • triggers
  • Triggers en mysql
  • Triggers mysql

Conviértase en miembro formal de Buenas Tareas

INSCRÍBETE - ES GRATIS