Creación de Disparadores
Para crear disparadores, utilice la interfaz gráfica de SQL Developer o la sentencia DDL CREATE TRIGGER.
En esta sección se muestra cómo utilizar ambas formas para crear disparadores.
Por defecto, un disparador se crea en el estado activado. Para crear un disparador en estado desactivado, utilice la sentencia CREATE TRIGGER con la cláusula DISABLE.
Nota: Para crear disparadores, debe tener privilegios adecuados; sin embargo, para esta discusión y aplicación sencilla, no necesita esta información adicional.
Nota: Para realizar los tutoriales en este documento, debe estar conectado a Oracle Database como usuario HR desde SQL Developer.
Consulte además:
-
Oracle Database PL/SQL Language Reference para más información sobre la sentencia CREATE TRIGGER
Acerca de los Pseudoregistros OLD y NEW
Cuando se arranca un disparador a nivel de fila, el sistema de tiempo de ejecución de PL/SQL crea y rellena los dos pseudoregistros OLD y NEW. Se llaman pseudoregistros porque tienen algunas, pero no todas, las propiedades de registros.
Para la fila que el disparador está procesando:
-
Para un disparador INSERT, OLD no contiene ningún parámetro y NEW contiene los valores nuevos.
-
Para un disparador UPDATE, OLD contiene los valores antiguos y NEW, los valores nuevos.
-
Para un disparador DELETE, OLD contiene los valores antiguos y NEW no contiene ningún valor.
Para hacerse referencia a un pseudoregistro, coloque los dos puntos antes de su nombre, :OLD o :NEW, como se muestra en Ejemplo 6-1.
Consulte también: Referencia de lenguaje PL/SQL de Oracle Database para obtener más información sobre Pseudorecords antiguos y nuevos
Tutorial: Creación de un Disparador que Registre Cambios de Tablas
Este tutorial muestra cómo utilizar la sentencia CREATE TRIGGER para crear un disparador, EVAL_CHANGE_TRIGGER, que agrega una fila a la tabla EVALUATIONS_LOG siempre que una sentencia INSERT, UPDATE o DELETE cambie la tabla EVALUATIONS.
El disparador agrega la fila después de que se ejecuta la sentencia disparadora y utiliza los predicados condicionales INSERTING, UPDATING y DELETING para determinar cuál de los tres sentencias DML posibles han arrancados el disparador.
EVAL_CHANGE_TRIGGER es un disparador a nivel de instrucción y un disparador AFTERO.
Para crear EVALUATIONS_LOG y EVAL_CHANGE_TRIGGER:
-
Cree la tabla EVALUATIONS_LOG:
CREATE TABLE EVALUATIONS_LOG ( log_date DATE , action VARCHAR2(50)); -
Crear EVAL_CHANGE_TRIGGER:
CREATE OR REPLACE TRIGGER EVAL_CHANGE_TRIGGER AFTER INSERT OR UPDATE OR DELETE ON EVALUATIONS DECLARE log_action EVALUATIONS_LOG.action%TYPE; BEGIN IF INSERTING THEN log_action := 'Insert'; ELSIF UPDATING THEN log_action := 'Update'; ELSIF DELETING THEN log_action := 'Delete'; ELSE DBMS_OUTPUT.PUT_LINE('This code is not reachable.'); END IF; INSERT INTO EVALUATIONS_LOG (log_date, action) VALUES (SYSDATE, log_action); END;
Consulte también: Referencia de lenguaje PL/SQL de Oracle Database para obtener más información sobre los predicados condicionales
Tutorial: Creación de un Disparador que Genere una Clave Primaria para una Fila Antes de que se Inserte
Este tutorial muestra cómo utilizar la herramienta Crear Disparador SQL Developer para crear un disparador llamado que arranca antes de que una fila se inserte en la tabla EVALUATIONS y genera el número único para la clave primaria de esa fila mediante EVALUATIONS_SEQUENCE.
La secuencia EVALUATIONS_SEQUENCE (creada en "Tutorial: Creating a Sequence") genera claves primarias para la tabla EVALUATIONS (creada en). Sin embargo, estas claves primarias no se insertan en la tabla automáticamente.
Este tutorial muestra cómo utilizar la herramienta Crear Disparador SQL Developer para crear un disparador llamado NEW_EVALUATION_TRIGGER, que arranca antes de Que una fila se inserte en la tabla EVALUATIONS y genera el número único para la clave primaria de esa fila mediante EVALUATIONS_SEQUENCE. El disparador arranca una vez para cada fila afectada por la sentencia disparadora INSERT.
NEW_EVALUATION_TRIGGER es un disparador a nivel de fila y un disparador ANTES.
Pasos para crear el disparador NEW_EVALUATION:
-
En el marco Conexiones, expanda hr_conn.
-
En la lista de tipos de objetos de esquema, haga clic con el botón derecho en Disparadores.
-
En la lista de opciones, seleccione Nuevo disparador.
-
En la ventana Create Trigger:
-
En el campo Nombre, escriba
NEW_EVALUATION_TRIGGERsobre el valor por defecto TRIGGER1. -
Para el objeto base, seleccione EVALUATIONS en el menú.
-
Mueva INSERT de Available Events a Selected Events.
(Seleccione INSERT y seleccione >).
-
Anule la selección de la opción Statement Level (Nivel de extracto).
-
Seleccione Aceptar.
Se abrirá los paneles NEW_EVALUATION_TRIGGER en el que se mostrará la sentencia CREATE TRIGGER que ha creado el disparador:
CREATE OR REPLACE TRIGGER NEW_EVALUATION_TRIGGER BEFORE INSERT ON EVALUATIONS FOR EACH ROW BEGIN NULL; END;El título del panel NEW_EVALUATION_TRIGGER aparece en cursiva, lo que indica que el disparador todavía no se ha guardado en la base de datos.
-
-
En la sentencia CREATE TRIGGER, reemplace NULL con el siguiente texto:
:NEW.evaluation_id := evaluations_sequence.NEXTVAL -
En el menú Archivo, seleccione Guardar.
Oracle Database compilará el procedimiento y lo guardará. El título del panel NEW_EVALUATION_TRIGGER dejará de estar en cursiva.
Creación de un Disparador INSTEAD OF
Una vista presenta la salida de una consulta como una tabla. Si desea cambiar una vista porque desea cambiar una tabla, debe crear los disparadores INSTEAD OF. Éstos, en lugar de cambiar la vista, cambian las tablas subyacentes.
Por ejemplo, considere la vista EMP_LOCATIONS, cuya columna NAME se crea a partir de las columnas LAST_NAME y FIRST_NAME de la tabla EMPLOYEES:
CREATE VIEW EMP_LOCATIONS AS
SELECT e.EMPLOYEE_ID,
e.LAST_NAME || ', ' || e.FIRST_NAME NAME,
d.DEPARTMENT_NAME DEPARTMENT,
l.CITY CITY,
c.COUNTRY_NAME COUNTRY
FROM EMPLOYEES e, DEPARTMENTS d, LOCATIONS l, COUNTRIES c
WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID AND
d.LOCATION_ID = l.LOCATION_ID AND
l.COUNTRY_ID = c.COUNTRY_ID
ORDER BY LAST_NAME;
Para actualizar la vista EMP_LOCATIONS.NAME (creada en "Creación de Vistas con la Sentencia CREATE VIEW"), debe actualizar EMPLOYEES.LAST_NAME y EMPLOYEES.FIRST_NAME. Esto es lo que hace el disparador INSTEAD OF del Example 6-1.
NEW y OLD son pseudoregistros que el motor de tiempo de ejecución de PL/SQL crea y rellena siempre que se arranca un disparador a nivel de fila. OLD y NEW almacenan los valores originales y nuevos, respectivamente, del registro que está procesando el disparador. Se llaman pseudoregistros puesto que no cuentan con todas las propiedades de los registros PL/SQL.
Ejemplo 6-1 Creación de un Disparador INSTEAD OF
CREATE OR REPLACE TRIGGER update_name_view_trigger
INSTEAD OF UPDATE ON emp_locations
BEGIN
UPDATE employees SET
first_name = substr( :NEW.name, instr( :new.name, ',' )+2),
last_name = substr( :NEW.name, 1, instr( :new.name, ',')-1)
WHERE employee_id = :OLD.employee_id;
END;
Consulte además:
-
Referencia de lenguaje PL/SQL de Oracle Database para obtener más información sobre los disparadores INSTEAD OF
-
Referencia de lenguaje PL/SQL de Oracle Database para obtener más información sobre OLD y NEW
Tutorial: Creación de Disparadores que Registren Eventos LOGON y LOGOFF
En este tutorial se muestra cómo utilizar la sentencia CREATE TRIGGER para crear dos disparadores, HR_LOGON_TRIGGER y HR_LOGOFF_TRIGGER. Después de que alguien inicie la sesión como usuario HR, HR_LOGON_TRIGGER agrega una fila a la tabla HR_USERS_LOG. Antes de Que alguien cierre la sesión como usuario HR, HR_LOGOFF_TRIGGER agrega una fila a la tabla HR_USERS_LOG.
HR_LOGON_TRIGGER y HR_LOGOFF_TRIGGER son un disparador de sistema. HR_LOGON_TRIGGER es un disparador AFP y HR_LOGOFF_TRIGGER es un disparador BEFORE.
Pasos para crear los valores HR_USERS_LOG, HR_LOGON_TRIGGER y HR_LOGOFF_TRIGGER:
-
Cree la tabla HR_USERS_LOG:
CREATE TABLE hr_users_log ( user_name VARCHAR2(30), activity VARCHAR2(20), event_date DATE ); -
Crear HR_LOGON_TRIGGER:
CREATE OR REPLACE TRIGGER hr_logon_trigger AFTER LOGON ON HR.SCHEMA BEGIN INSERT INTO hr_users_log (user_name, activity, event_date) VALUES (USER, 'LOGON', SYSDATE); END; -
Crear HR_LOGOFF_TRIGGER:
CREATE OR REPLACE TRIGGER hr_logoff_trigger BEFORE LOGOFF ON HR.SCHEMA BEGIN INSERT INTO hr_users_log (user_name, activity, event_date) VALUES (USER, 'LOGOFF', SYSDATE); END;
Consulte también: Referencia de lenguaje PL/SQL de Oracle Database para obtener más información sobre los disparadores del sistema