Triggers
Triggers
Triggers
DISPARADORES EN SQL:1999
Un disparador (trigger) es un procedimiento especial que se ejecuta en respuesta a un evento especfico.
Ej. Al aumentar el sueldo de un empleado, que se aumente automticamente el total de gastos de la empresa.
[temporalidad del evento] [granularidad del evento] [WHEN condicin] BEGIN cuerpo del trigger END;
EVENTO
CONDICIN
ACCIN
Operadores lgicos:
AND, OR, NOT
EJEMPLO
CREATE TRIGGER Ejemplo-fila AFTER DELETE OF codigo ON tabla1 FOR EACH ROW WHEN ((OLD.nombre=pepe) OR (OLD.edad > 35)) BEGIN
DELETE FROM tabla2 WHERE tabla2.cod=:OLD.cod;
END Ejemplo-columna; /
EJEMPLO
CREATE TRIGGER Ejemplo_sentencia AFTER DELETE ON tabla1
REFERENCING OLD AS anterior
BEGIN
DELETE FROM tabla2 WHERE tabla2.cod=anterior.cod;
END Ejemplo_sentencia; /
ACTIVAR/DESACTIVAR DE DISPARADORES
Todos los disparadores asociados a una tabla:
ALTER TABLE nombre_tabla ENABLE ALL TRIGGERS ALTER TABLE nombre_tabla DISABLE ALL TRIGGERS
Un disparador especfico:
ALTER TRIGGER nombre_disparador ENABLE
ALTER TRIGGER nombre_disparador DISABLE
OTRAS FUNCIONES
Eliminar un disparador
DROP TRIGGER nombre_disparador
OTRAS FUNCIONES
Ver el cuerpo de un disparador
SELECT TRIGGER_BODY FROM USER_TRIGGERS WHERE TRIGGER_NAME=nombre_disparador;
CREATE OR REPLACE TRIGGER ejemplo BEFORE DELETE ON tabla FOR EACH ROW BEGIN
Declaracin de variables
Dentro de un disparador se pueden declarar variables que se utilizarn dentro del cuerpo del mismo.
CREATE... BEFORE... [FOR EACH ROW ...] DECLARE Declaracin de variables BEGIN ... Nombre CONSTANT NUMBER:=valor; nombre TIPO; nombre nombretabla.nombrecolumna%TYPE; nombre nombretabla%ROWTYPE;
Crea una variable nombre del mismo tipo que el de la columna nombrecolumna de la tabla nombretabla
Crea una variable nombre del tipo de la tabla. Para asignar el valor de una columna se pone: nombre.nombrecolumna
Disparadores de sustitucin
INSTEAD OF. Slo para vistas
CREATE VIEW vista AS SELECT edificio, sum(numero_asientos) FROM habitaciones GROUP BY edificio;
Es ilegal hace una operacin de borrado directamente en la vista: DELETE FROM vista WHERE edificio=edificio 7; Se crea un disparador de sustitucin que efecte el borrado equivalente pero sobre la tabla habitaciones
Disparadores de sustitucin
CREATE TRIGGER borra_en_vista INSTEAD OF DELETE ON vista FOR EACH ROW BEGIN DELETE FROM habitaciones WHERE edificio = :OLD.edificio; END borra_en_vista; /
Variables
Sintaxis: @<Nombre de la variable> Ejemplos
@saldo @ventas @x
Instrucciones de asignacin
<variable> = <valor> Examples:
@X = 5; @Y = @X; @X = @Y + 7;
@X toma el valor de 5
@X = 5
5 = @X
Trigger Example
DELIMITER $$ -- set delimeter (allow ; inside) CREATE TRIGGER newsCounter AFTER INSERT ON News FOR EACH ROW BEGIN INSERT INTO NewsCount (newsItemCount) (SELECT count(*) FROM News); END; $$ DELIMITER ; -- reset delimeter
Sample DB
CREATE TABLE NewsCategories ( catID int not null auto_increment, catName varchar(32), primary key(catID));
CREATE TABLE News ( newsID int not null auto_increment, catID int not null, title varchar(32) not null, txt blob, primary key(newsID));
CREATE TABLE NewsCount ( newsItemCount int );
Trigger Example
DELIMITER $$ CREATE TRIGGER newsCategoryHandler AFTER DELETE ON NewsCategories FOR EACH ROW BEGIN DELETE FROM News WHERE catID=OLD.catID; END; $$ DELIMETER ; -- Note: can reference NEW.attr on insert, update
Trigger Example
DELIMITER $$
CREATE TRIGGER newsCounter AFTER INSERT ON News FOR EACH ROW BEGIN DELETE FROM NewsCount; INSERT INTO NewsCount (newsItemCount) (SELECT count(*) FROM News); END; $$
Trigger Statements
DROP TRIGGER newsCounter; SHOW TRIGGERS;
One trigger per event, per table Can add procedural elements, such as IF statements See reference 4 (databasedesign-resource) for another example