Disparadores.pdf

22
Disparadores (Triggers)

Transcript of Disparadores.pdf

Disparadores (Triggers)

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 1

DROP TRIGGER proteger_datos ON numeros

DROP TRIGGER rellenar_datos ON numeros

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();

Tomado de:

Portal en Español de PostgreSQLhttp://www.postgresql.org.es/node/301