Disparadores.pdf
Transcript of Disparadores.pdf
Disparador (Trigger)
Un disparador es una acción definidaen una tabla de la base de datos y quese ejecuta automáticamente por unprocedimiento almacenado. Eldisparador se activará, según sedefina, cuando se realice un INSERT,un UPDATE ó un DELETE.
Un Disparador se crea:
• Para que ocurra ANTES de cualquierINSERT, UPDATE o DELETE
• Para que ocurra DESPUÉS de cualquierINSERT, UPDATE o DELETE
• Para que se ejecute una sola vez porcomando SQL
• Para que se ejecute por cada líneaafectada por un comando
Disparador (Sintaxis en Postgres)
CREATE TRIGGER nombre { BEFORE |AFTER } { INSERT | UPDATE | DELETE [OR ... ] } ON tabla [ FOR [ EACH ] { ROW| STATEMENT } ] EXECUTE PROCEDUREnombre de función ( argumentos )
NEW
Tipo de dato RECORD; Variableque contiene la nueva fila de latabla para las operacionesINSERT/UPDATE en disparadoresdel tipo row-level. Esta variable esNULL en disparadores del tipostatement-level.
OLD
Tipo de dato RECORD; Variableque contiene la antigua fila de latabla para las operacionesUPDATE/DELETE en disparadoresdel tipo row-level. Esta variable esNULL en disparadores del tipostatement-level.
TG_NAME
Tipo de dato name; variableque contiene el nombre deldisparador que está usando lafunción actualmente.
TG_WHEN
Tipo de dato text; una cadenade texto con el valor BEFORE oAFTER dependiendo de como eldisparador que está usando lafunción actualmente ha sidodefinido.
TG_LEVEL
Tipo de dato text; una cadenade texto con el valor ROW oSTATEMENT dependiendo decomo el disparador que estáusando la función actualmenteha sido definido.
TG_OP
Tipo de dato text; una cadenade texto con el valor INSERT,UPDATE o DELETE dependiendode la operación que ha activadoel disparador que está usando lafunción actualmente.
Ejemplo 1 – Parte 1
CREATE TABLE numeros(numero bigint NOT NULL, cuadrado bigint, cubo bigint,raiz2 real, raiz3 real, PRIMARY KEY (numero) );
Ejemplo 1 – Parte 2
CREATE OR REPLACE FUNCTION rellenar_datos() RETURNS TRIGGER AS $rellenar_datos$ BEGIN
NEW.cuadrado := power(NEW.numero,2); NEW.cubo := power(NEW.numero,3); NEW.raiz2 := sqrt(NEW.numero); NEW.raiz3 := cbrt(NEW.numero); RETURN NEW;
END; $rellenar_datos$ LANGUAGE plpgsql;
Ejemplo 1 – Parte 3
CREATE TRIGGER rellenar_datosBEFORE INSERT OR UPDATE ON numeros FOR EACH ROW EXECUTE PROCEDURE rellenar_datos();
Ejemplo 2 – Parte 1
CREATE OR REPLACE FUNCTION proteger_datos() RETURNS TRIGGER AS $proteger_datos$ BEGIN
RETURN NULL; END; $proteger_datos$ LANGUAGE plpgsql;
Ejemplo 2 – Parte 2
CREATE TRIGGER proteger_datosBEFORE DELETE ON numeros FOR EACH ROW EXECUTE PROCEDURE proteger_datos();
Ejemplo 3 – Parte 2
CREATE OR REPLACE FUNCTION proteger_y_rellenar_datos() RETURNS TRIGGER AS $proteger_y_rellenar_datos$ BEGIN
IF (TG_OP = 'INSERT' OR TG_OP = 'UPDATE' ) THEN NEW.cuadrado := power(NEW.numero,2); NEW.cubo := power(NEW.numero,3); NEW.raiz2 := sqrt(NEW.numero); NEW.raiz3 := cbrt(NEW.numero); RETURN NEW;
ELSEIF (TG_OP = 'DELETE') THEN RETURN NULL;
END IF; END; $proteger_y_rellenar_datos$ LANGUAGE plpgsql;
Ejemplo 3 – Parte 3
CREATE TRIGGER proteger_y_rellenar_datosBEFORE INSERT OR UPDATE OR DELETE ON numerosFOR EACH ROW EXECUTE PROCEDURE proteger_y_rellenar_datos();
Ejemplo 4 – Parte 1
CREATE TABLE cambios( timestamp_ TIMESTAMP WITH TIME ZONE default NOW(), nombre_disparador text, tipo_disparador text, nivel_disparador text,usuario text, comando text );
Ejemplo 4 – Parte 2
CREATE OR REPLACE FUNCTION grabar_operaciones() RETURNS TRIGGER AS $grabar_operaciones$ BEGIN
INSERT INTO cambios (nombre_disparador,tipo_disparador, nivel_disparador, usuario,comando) VALUES (TG_NAME, TG_WHEN, TG_LEVEL, USER, TG_OP); RETURN NULL;
END; $grabar_operaciones$ LANGUAGE plpgsql;
Ejemplo 4 – Parte 3
CREATE TRIGGER grabar_operacionesAFTER INSERT OR UPDATE OR DELETE ON numerosFOR EACH STATEMENT EXECUTE PROCEDURE grabar_operaciones();