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;
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 |
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;