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;