Triggers Modulo
Triggers Modulo
Triggers Modulo
Otra cosa que tenemos que tener en cuenta es que, por cada disparador que
definamos en una tabla, nuestra base de datos tendrá que ejecutar la función
asociada a dicho disparador. El uso de disparadores de manera incorrecta ó
inefectiva puede afectar significativamente al rendimiento de nuestra base de
datos.
NEW
Tipo de dato RECORD; Variable que contiene la nueva fila de la tabla para las
operaciones INSERT/UPDATE en disparadores del tipo row-level. Esta variable es
NULL en disparadores del tipo statement-level.
OLD
Tipo de dato RECORD; Variable que contiene la antigua fila de la tabla para las
operaciones UPDATE/DELETE en disparadores del tipo row-level. Esta variable
es NULL en disparadores del tipo statement-level.
TG_NAME
Tipo de dato name; variable que contiene el nombre del disparador que está
usando la función actualmente.
TG_WHEN
Tipo de dato text; una cadena de texto con el valor BEFORE o AFTER
dependiendo de como el disparador que está usando la función actualmente ha
sido definido
TG_LEVEL
Tipo de dato text; una cadena de texto con el valor ROW o STATEMENT
dependiendo de como el disparador que está usando la función actualmente ha
sido definido
TG_OP
Tipo de dato text; una cadena de texto con el valor INSERT, UPDATE o DELETE
dependiendo de la operación que ha activado el disparador que está usando la
función actualmente.
TG_RELID
Tipo de dato oid; el identificador de objeto de la tabla que ha activado el
disparador que está usando la función actualmente.
TG_RELNAME
Tipo de dato name; el nombre de la tabla que ha activado el disparador que está
usando la función actualmente. Esta variable es obsoleta y puede desaparacer en
el futuro. Usar TG_TABLE_NAME.
TG_TABLE_NAME
Tipo de dato name; el nombre de la tabla que ha activado el disparador que está
usando la función actualmente.
TG_TABLE_SCHEMA
Tipo de dato name; el nombre de la schema de la tabla que ha activado el
disparador que está usando la función actualmente.
TG_NARGS
Tipo de dato integer; el número de argumentos dados al procedimiento en la
sentencia CREATE TRIGGER.
TG_ARGV[]
Tipo de dato text array; los argumentos de la sentencia CREATE TRIGGER. El
índice empieza a contar desde 0. Indices inválidos (menores que 0 ó
mayores/iguales que tg_nargs) resultan en valores nulos.
Después tenemos que crear una función en PL/pgSQL para ser usada por nuestro
disparador. Nuestra primera función es la más simple que se puede definir y lo
único que hará será devolver el valor NULL:
Función
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;
trigger
CREATE TRIGGER rellenar_datos BEFORE INSERT OR UPDATE
ON numeros FOR EACH ROW
EXECUTE PROCEDURE rellenar_datos();
Ahora vamos a ver como los disparadores que hemos definido en la tabla numeros
funcionan:
INSERT INTO numeros (numero) VALUES (2);
De nuevo veamos como los disparadores que hemos definido en la tabla numeros
funcionan:
Hemos realizado 2 INSERT y 1 UPDATE. Esto significa que por cada uno de estos
comandos el sistema ha ejecutado la función rellenar_datos(), una vez por cada
fila afectada y antes de actualizar la tabla numeros.
NEW.cuadrado := power(NEW.numero,2);
NEW.cubo := power(NEW.numero,3);
NEW.raiz2 := sqrt(NEW.numero);
NEW.raiz3 := cbrt(NEW.numero);
RETURN NEW;
Esta función retorna el valor NULL y esto significa, según la regla 6.1 definida en
este artículo, que para la fila afectada no se ejecutará el comanado DELETE. Por
eso y mientras este disparador este instalado será imposible de borrar nada de la
tabla numeros.
Function proteger_y_rellenar_datos()
CREATE OR REPLACE FUNCTION proteger_y_rellenar_datos() RETURNS
TRIGGER AS $proteger_y_rellenar_datos$
DECLARE
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 IF;
END;
$proteger_y_rellenar_datos$ LANGUAGE plpgsql
Tigger proteger_y_rellenar_datos()
Y todo seguirá funcionando de la misma manera que con los dos disparadores del
comienzo:
SELECT * from numeros;
Mire lo que paso en la tabla números
Resultado
numero cuadrado cubo raiz2 raiz3
2 4 8 1.41421 1.25992
4 16 64 2 1.5874
Por último y antes de terminar, vamos a definir un disparador del tipo statement-
level que se ejecute después de nuestras sentencias INSERT, UPDATE y DELETE.
La función ejecutada por este disparador grabará datos de la ejecución en la tabla
cambios (esto no sirve para mucho en la vida real, pero como ejemplo está bien
para ver cómo funciona).
RETURN NULL;
END;
$grabar_operaciones$ LANGUAGE plpgsql;
SQL ejecutada.
Ejercicio 1
FUNCIÓN
CREATE OR REPLACE FUNCTION actualizar_nombre() RETURNS TRIGGER
AS $trigger_ejemplo$
BEGIN
NEW.nombre := NEW.pat_pad || ' ' || NEW.mat_pad || ' ' || NEW.nom_pad ;
RETURN NEW;
END;
$trigger_ejemplo$ LANGUAGE plpgsql;
TRIGGER
CREATE TRIGGER trigger_ejemplo
BEFORE INSERT OR UPDATE ON usuario
FOR EACH ROW EXECUTE PROCEDURE actualizar_nombre();
Luego de ejecutar, esto debe llenar la base de datos Y mirar lo que sucede
con nombre
Ejercicio 2