Anda di halaman 1dari 31

UT3: Automatizacin de tareas:

Construccin de guiones de
administracin

Triggers

Triggers
Los triggers o disparadores son bloques de
PL/SQL almacenados que se ejecutan o
disparan automticamente cuando se
producen ciertos eventos.
Tres tipos de disparadores de bases de datos:
Disparadores de tablas.
Disparadores de sustitucin.
Disparadores del sistema.

Triggers
- Disparadores de tablas:
Asociados a una tabla. Se disparan cuando se produce un
determinado suceso o eventos de manipulacin que afecta a la
tabla (insercin, borrado o modificacin de filas).
- Disparadores de sustitucin:
Asociados a vistas. Se disparan cuando se intenta ejecutar un
comando de manipulacin que afecta a la vista (insercin, borrado
o modificacin de filas).
- Disparadores del sistema:
Se disparan cuando ocurre un evento del sistema (arranque o
parada de la base de datos, entrada o salida de un usuario, etc) o
una instruccin de definicin de datos (creacin, modificacin o
eliminacin de una tabla u otro objeto).

Triggers
Se pueden utilizar para:
-

Implementar restricciones complejas de seguridad o integridad.

Posibilitar la realizacin de operaciones de manipulacin sobre vistas.

Prevenir transacciones errneas.

Implementar reglas administrativas complejas.

Generar automticamente valores derivados.

Auditar las actualizaciones, incluso, enviar alertas

Gestionar rplicas remotas de la tabla.

Etc.

Triggers
Creacin de un trigger
CREATE [OR RELACE]
/* cabecera del trigger*/
TRIGGER nombre_trigger
{BEFORE|AFTER|INSTEAD OF} evento_disparo
[WHEN condicin_disparo]
/* comienzo del cuerpo del trigger. Es un bloque de PL/SQL*/
[DECLARE ----opcional
<declaraciones>]
BEGIN
<acciones>
[EXCEPTION -------opcional
<gestin de excepciones>]
END];

Triggers
Cabecera del trigger:
Nombre del trigger: es el nombre o identificador del
disparador.
Evento de disparo: es el suceso que producir la ejecucin
del disparador. Puede ser:
Una orden DML(INSERT, DELETE, UPDATE) sobre una tabla o vista.
Una orden DDL (CREATE, ALTER, etc.)
O un suceso del sistema.

Restriccin del trigger: condiciona la ejecucin del trigger


al cumplimiento de la condicin.

Cuerpo del trigger: Es el cdigo que se ejecutar


cuando se produzca el evento y cumplan las
condiciones especificadas en la cabecera. Es un bloque
PL/SQL.

Triggers
Disparadores de tablas:
Son disparadores asociados a una determinada
tabla de la base de datos que se disparan cuando
se produce un determinado suceso o evento de
manipulacin que afecta a la tabla (insercin,
borrado o modificacin de filas).
Vamos a crear un trigger que se dispare despus de
cada modificacin de la columna salario de la
tabla empleado.
Para ello crearemos una tabla auditarempleado en
la cual insertaremos una fila con el texto SUBIDA
SALARIO EMPLEADO y el nmero del empleado al
cual se le ha subido el sueldo.

Triggers
create table auditoria_empleado
(
empleado varchar2(100),
);
Creamos ahora el trigger de nombre audit_subida_salario que se disparar cada
vez que se modifique la columna salario de empleado.
CREATE OR REPLACE TRIGGER audit_subida_salario
AFTER UPDATE OF salario
ON empleado
FOR EACH ROW
BEGIN
INSERT INTO auditoria_empleado VALUES(SUBIDA SALARIO EMPLEADO
||:old.nss);
END;
/

Triggers
En estos disparadores el evento de disparo ser una orden
de manipulacin: INSERT, DELETE o UPDATE. En el caso de
esta ltima , se podr especificar opcionalmente las
columnas cuya modificacin producir el disparo.
El momento del disparo puede ser antes (BEFORE) o
despus (AFTER)de que se ejecute la orden de
manipulacin.
El nivel de disparo del trigger puede se a nivel de orden o
a nivel de fila.
A nivel de orden (STATEMENT): El trigger se activar una sola
vez para cada orden, independientemente del n de filas
afectadas por ella ( la clusula es FOR EACH STATEMENT-es la
opcin por defecto-)
A nivel de fila: el trigger se activar una vez por cada fila
afectada por la orden. Para ello se incluir la clusula FOR EACH
ROW

Triggers
Valores NEW y OLD, es para hacer referencia a
los valores anterior y posterior a una
actualizacin a nivel de fila y se hace como
:old.nombrecolumna y :new.nombrecolumna.

Triggers
- Un mismo trigger puede ser disparado por
distintas operaciones o eventos. Para utilizarlo
se emplea el operador OR
- P.e: BEFORE DELETE OR UPDATE ON
empleados
Se emplea INSERTING, DELETING, UPDATING y
UPDATING(nombrecolumna) para distinguir
que evento dispara el trigger.

Triggers
Por ejemplo:
CREATE TRIGGER nombre_trigger
BEFORE INSERT OR UPDATE OR DELETE ON empleados
BEGIN
IF INSERTING THEN
ELSIF DELETING THEN
ELSIF UPDATING(salario) THEN
END IF

END;

Triggers
Restricciones de los disparadores

El cuerpo de un disparador es un bloque PL/SQL. Cualquier orden que sea


legal en un bloque PL/SQL, es legal en el cuerpo de un disparador, con las
siguientes restricciones:
Un disparador no puede emitir ninguna orden de control de
transacciones: COMMIT, ROLLBACK o SAVEPOINT. El disparador se activa
como parte de la ejecucin de la orden que provoc el disparo, y forma
parte de la misma transaccin que dicha orden. Cuando la orden que
provoca el disparo es confirmada o cancelada, se confirma o cancela
tambin el trabajo realizado por el disparador.
Por razones idnticas, ningn procedimiento o funcin llamado por el
disparador puede emitir rdenes de control de transacciones.
El cuerpo del disparador no puede contener ninguna declaracin de
variables LONG o LONG RAW.
No se pueden utilizar comandos DDL

Triggers
Disparadores de sustitucin:
Son disparadores asociados a vistas que
arrancan el ejecutarse una instruccin de
actualizacin sobre la vista a la que estan
asociados. Se ejecutan en lugar de (INSTEAD
OF) la orden de manipulacin que produce el
disparo del trigger.

Triggers
El formato genrico para la creacin de estos
disparadores de sustitucin es:
CREATE [OR REPLACE] TRIGGER nombre_trigger
INSTEAD OF
{DELETE | INSERT |UPDATE [OF
<lista_columnas>]}
ON nombre_vista
[FOR EACH ROW ] [WHEN (condicion)]
<cuerpo del trigger (BLOQUE PL/SQL)>

Triggers
Los disparadores de sustitucin se ejecutan
siempre a nivel de fila, as pues, la clusula FOR
EACH ROW es opcional, pero no hay otra
posibilidad.
Los trigger de sustitucin tienen estas
caractersticas diferenciales:
- Solamente se utilizan en trigger asociados a
vistas.
- Actan siempre a nivel de fila

Triggers

Triggers

Triggers
Disparadores de sistema
Se disparan cuando ocurre un evento del
sistema(arranque- parada de la base de datos,
entrada salida de un usuario , etc.) o una
instruccin de definicin de datos (creacin,
modificacin o eliminacin de un objeto de la
base de datos).
Para crear un trigger del sistema hay que
tener el privilegio ADMINISTER DATABASE
TRIGGER.

Triggers
La sintaxis para la creacin es:
CREATE [OR REPLACE] TRIGGER nombre_trigger
{BEFORE |AFTER} {<lista eventos definicin>
|<lista eventos del sistema>}
ON {DATABASE | SCHEMA} [WHEN (condicin)]
<CUERPO DEL TRIGGER (BLOQUE DE PL/SQL)>

Triggers
Donde:
- El nombre del trigger puede incluir el esquema mediante la
notacin de punto.
- <lista de eventos de definicin> puede incluir uno o ms eventos
DDL separados por OR.
- <lista de eventos del sistema> puede incluir uno o ms eventos del
sistema separados por OR.
- El especificador ON SCHEMA|DATABASE indica el nivel de disparo
del trigger:
- ON DATABASE se disparar siempre que ocurra el evento de
disparo.
- ON SCHEMA se disparar solamente si el evento ocurre en el
esquema determinado por el trigger. Por defecto, este esquema es
aquel al que pertenece el trigger, pero se puede indicar otro
mediante la notacin de punto :ON esquema.SCHEMA

Triggers

Al asociar un disparador a un evento del sistema debemos indicar el momento del


disparo. Algunos eventos slo pueden dispararse ANTES de producirse, otros
DESPUES y otros admiten las dos posibilidades

Triggers
Los disparadores STARTUP y SHUTDOWN, slo tienen sentido a
nivel de ON DATABASE, no asociados a un esquema, ya que, aunque
Oracle permite la asociacin, nunca se dispararn.
Estos eventos no pueden llevar las clusula WHEN pues no
permiten condiciones
STARTUP se activa al abrir el sistema
SHUTDOWN se activa justo antes de que el servidor inicie el
proceso de desconexin de la instancia. Si se produce una
desconexin inesperada del servidor de la base de datos, este
suceso no se ejecutar.
SERVERERROR se activa cuando se produce un error de Oracle (no
se activa para los errores ORA-1034,ORA-1403,ORA-1422, ORA1423 y ORA-4030, ya que son demasiados graves como para que el
proceso pueda continuar ejecutndose.

Triggers
PL/SQL dispone de algunas funciones que
permiten acceder a los atributos del evento del
disparo ORA_SYSTEVENT, ORA_LOGIN_USER,
ORA_DICT_OBJ_NAME, ORA_DICT_OBJ_TYPE,
etc. En los manuales del producto podemos
encontrar un listado completo de las funciones
accesibles desde estos disparadores. Estas
funcione pueden usarse en la clusula WHEN o
en el cuerpo del disparador.
Veamoslos:

Triggers
Atributos:
Ora_client_ip_address: Permite conocer la direccin
IP del equipo que acta como origen de la conexin.
Ora_database_name: Nombre de la base de datos.
Ora_login_user: usuario que ha iniciado la sesin.
Ora_privileges: lista de privilegios concedido o
revocados a un determinado usuario.
Ora_revoke: a que usuarios se le ha revocado un
privilegio

Triggers
Ora_server_error: devuelve el nmero de error de
Oracle que se encuentra en la pila, cuya posicin
ase ha pasado como parmetro( la parte superior
de la pila corresponde a la posicin 1).
Ora_sysevent: nombre del suceso del sistema que
ha activado el disparador.
Ora_with_grant_option: devuelve TRUE si el
privilegio ha sido concedido con una opcin de
administrcin.

Triggers
Cabe mencionar que:
Desde un disparador LOGON o LOGOFF se puede
comprobar el identificador de usuario, o el
nombre de usuario (ID, USERID, USERNAME).
Desde un disparador DDL se puede comprobar el
tipo y el nombre del objeto que se est
modificando (y el ID o nombre de usuario)

Triggers
Disparador para controlar las conexiones de los usuarios en la base
de datos:
create trigger trg_logon_db
after logon on database
begin
insert into auditoria_conexiones (quien, cuando, que) values
(user, sysdate, 'logon');
end;
create trigger tgr_logoff
before logoff on database
begin
insert into auditoria_conexiones (quien, cuando, que) values
(sys_context('userenv','session_user'),sysdate,'logoff');
end;

Triggers
Para ello deberemos crear la tabla
auditoria_conexiones
Create table auditoria_conexiones
( quien varchar2(30),
cuando date,
que varchar2(40)
);

Triggers
Activar, desactivar, compilar y eliminar disparadores:
Cuando se crea un trigger este est activado
Desactivarlo:
ALTER TRIGGER nombre_trigger DISABLE
Volverlo a activar:
ALTER TRIGGER nombre_trigger ENABLE
Volver a compilarlo:
ALTER TRIGGER nombre_trigger COMPILE
Borrarlo:
DROP TRIGGER nombre_trigger

Triggers
Las vistas dba_trigger y user_trigger contienen toda la informacin sobre los
trigger.
Para conocer las columnas:
SQL> desc dba_trigger |user_trigger;
Ejemplos:
select trigger_name, table_name, triggering_event from user_triggers;
Resultados:

TRIGGER_NAME
TABLE_NAME
TRIGGERING_EVENT
------------------------------ ------------------------------ ----------------------------------------------------AUDIT_SUBIDA_SALARIO
EMPLEADO
UPDATE
TGR_LOGOFF
LOGOFF
TRG_LOGON_DB
LOGON
3 rows selected

Anda mungkin juga menyukai