> Manuales > Tutorial de Oracle

Vemos lo que es un disparador de sustitución y el de sistema, así como su creación en Oracle.

Disparadores de sustitución

Podemos crear triggers que no se ejecutan antes ni después de una instrucción sino en lugar de (instead of).
Solo podemos utilizar estos triggers si están asociados a vistas, además actúan siempre a nivel de fila.

La sintaxis de este tipo de trigger es la siguiente:

create [or replace] trigger nombre_trigger
   instead of { insert | delete | update [of columnas]}
   [ or { insert | delete | update}]
   on nombre vista
   [ for each row]
   [declare]
      declaraciones
   begin
      instrucciones
   [execption]
      excepciones
   end;

Sobre una vista podemos hacer un select pero si hacemos un insert, delete o update puede darnos problemas y no dejar ejecutarse la orden correctamente.
Los trigger sobre vistas vas a sustituir a estas operaciones por las correspondientes en las tablas que forman la vista.

Un ejemplo de trigger de sustitución seria el siguiente:

create or replace trigger t_borrado_emp
   instead of delete on empleado
   for each row
begin
   delete from emple where emp_num=:old.cod
end;

Disparadores de sistema

Estos trigger se disparan cuando se arranca o para la base de datos, entra o sale un usuario, cuando se crea, modifica o elimina un objeto, etc.

En Oracle para crear este tipo de trigger tenemos que tener privilegios de Administer database trigger.

La sintaxis de este trigger seria la siguiente:

create [or replace] trigger nombre_trigger
   { before | after } { <lista eventos de definición> | <lista eventos del sistema>}
   on { database | schema} [when (condición)]
   <cuerpo del trigger (bloque PL/SQL)>

Donde la lista de eventos de definición puede tener uno o más eventos DDL separados por or y la lista de eventos del sistema igualmente separados por or.

Al asociar un disparador a un evento debemos indicar el momento en que se dispare. A continuación os dejo una tabla de evento, momento y cuando se dispararía para dejarlo todo mas o menos claro.

Evento Momento Se disparan:
STARTUP AFTER Después de arrancar la instancia
SHUTDOWN BEFORE Antes de apagar la istancia
LOGON AFTER Después de que el usuario se conecte a la base de datos.
LOGOFF BEFORE Antes de la desconexión de un usuario
SERVERERROR AFTER Cuando ocurre un error en el servidor
CREATE BEFORE | AFTER Antes o después de crear un objeto en el esquema
DROP BEFORE | AFTER Antes o después de borrar un objeto en el esquema
ALTER BEFORE | AFTER Antes o después de cambiar un objeto en el esquema
TRUNCATE BEFORE | AFTER Antes o después de ejecutar un comando truncate
GRANT BEFORE | AFTER Antes o después de ejecutar un comando grant
REVOKE BEFORE | AFTER Antes o después de ejecutar un comando revoke
DLL BEFORE | AFTER Antes o después de ejecutar cualquier comando de definición de datos

Oracle tiene algunas funciones que permiten acceder a los atributos del evento del disparo ORA_YSEVENT, ORA_LOGIN, etc. Estas funciones pueden usarse en la clausula WHEN o en el cuerpo del disparador. En el manual de Oracle podéis encontrar el listado de todas estas funciones.

Un ejemplo seria un trigger que nos guarda los datos de un usuario al hacer login en la base de datos:

create or replace trigger control
   after logon
   on database
   begin
      insert into control_conexion (usuario, momento, evento)
      values {ORA_LOGIN_USER, SYSTIMESTAMP, ORA_SYSEVENT);
   end;

Sara Alvarez

Equipo DesarrolloWeb.com

Manual