Sistemas Operativos
Los TRIGGERS son un tipo de objetos muy especiales en SQL Server 2005, ya que realmente son muy parecidos a lo que las rutinas de atención a eventos en código en cualquier lenguaje de programación como por ejemplo .NET. Como objetos especiales que son también reciben parámetros de una forma muy especial, en forma de unas tablasvirtuales, llamadas inserted y deleted. Estas tablas especiales (inserted y deleted) contienen la información de los registros que se han eliminado o insertado, con exactamente las mismas columnas que la tabla base que está sufriendo esa modificación. Las tablas inserted y deleted estarán o no rellenas de datos en función de cual sea el tipo de operación que ha dado lugar a su ejecución. Porejemplo, un TRIGGER que se dispare por la inserción en una tabla tendrá tantos registros en la tabla virtual inserted como registros estén siendo insertados y cero registros en la tabla deleted; un TRIGGER que se dispare por la eliminación de registros en una tabla tendrá cero registros en la tabla inserted y tantos registros en la tabla deleted como registros estén siendo eliminados, y un TRIGGER queresponda a una operación de update, tendrá el mismo número de registros en la tabla inserted y en la tabla deleted que además coincidirá con el número de registros actualizados en la tabla que da lugar al evento.
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 el contador 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 elregistro.
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 actualizan esta 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 funcionasó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 es el 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 insertamos con 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...
Regístrate para leer el documento completo.