Triggers: Sintaxis
create or replace trigger NombreTrigger
{before | after | instead of}
{delete | insert | update [of NombreColumna
[, NombreColumna] ...] }
[or {delete | insert | update [of NombreColumna
[, NombreColumna] ...] } ] ...
on {NombreTabla | Nombre-Vista}
[ [referencing { old [as] NombreViejo | new [as]
NombreNuevo} ...]
for each {row | statement} [when (Condición)] ]
Bloque pl/sql
Triggers: Sintaxis
Eliminación
DROP TRIGGER nombre_disparador;
Activación/Desactivación
ALTER TRIGGER nombre_disparador {DISABLE |
ENABLE};
ALTER TABLE nombre_tabla
{ENABLE | DISABLE} ALL TRIGGERS;
Ver errores de compilación
SHOW ERRORS TRIGGER nombre_disparador;
Triggers: Componentes (1)
Nombre disparador:
Siguen las mismas normas de nomenclatura que otros
identificadores en la BD
Replace:
Se utiliza para sobreescribir un disparador existente
Before/After/Instead of:
Instante de ejecución del disparador con respecto al evento
que lo desencadena
Evento:
Tipo de orden DML sobre una tabla que provoca la
activación
del disparador
INSERT | DELETE | UPDATE [OF <lista de columnas>]
Triggers: Componentes (2)
Nivel:
FOR EACH ROW: disparadores a nivel de fila. Se activan
una vez por cada fila afectada por el evento
FOR EACH STATEMENT: disparadores a nivel de orden.
Se activan sólo una vez (antes o después de la orden).
When: Sólo tiene sentido a nivel de fila. La condición se
evalúa (true o false).
Triggers: Componentes (3)
Cuerpo: bloque PL/SQL con las siguientes restricciones:
Un disparador no puede emitir ninguna orden de control de
transacciones (COMMIT, ROLLBACK o SAVEPOINT)
Ningún procedimiento o función llamada por el disparador
puede emitir órdenes de control de transacciones
No puede contener ninguna declaración de variables LONG o
LONG RAW
No se puede acceder a cualquier tabla. Existen restricciones
(Tablas Mutantes)
No puede modificar las columnas que son Primary Key
Registros :old y :new
Un disparador a nivel de fila se ejecuta por cada fila en la
que se produce el suceso.
:old y :new son registros que nos permiten acceder a los
datos de la fila actual.
Ejemplo :old y :new
create sequence sec_estudiante start with 2;
create table estudiante (codigo number(2) primary key);
La forma habitual de incluir información en la tabla sería:
insert into estudiante values
(sec_estudiante.nextval);
Con este trigger se ignoran los valores que un usuario pudiera introducir como
código de estudiante y se inserta el siguiente valor de la secuencia.
create or replace trigger t_estudiante
before insert on estudiante for each row
begin
select sec_estudiante.nextval into :[Link] from
dual;
end;
/
INSERTING, DELETING Y UPDATING
Predicados empleados para determinar qué operación se está
realizando en un disparador.
CREATE OR REPLACE TRIGGER Cambios
BEFORE INSERT OR DELETE ON Alumnos
FOR EACH ROW
DECLARE
Cambio_tipo CHAR(1);
BEGIN
/* Usa ‘I’ para INSERT y ‘D’ Para DELETE */
IF INSERTING THEN
Cambio_tipo := ‘I’;
ELSE
Cambio_tipo := ‘D’;
END IF;
END;