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 la base de datos como usuario HR desde SQL Developer como usuario hr.

Consulte además:

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 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 AI Database para obtener más información sobre antiguos y nuevos pseudoregords.

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 organizado 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:

  1. Cree la tabla EVALUATIONS_LOG:

    CREATE TABLE EVALUATIONS_LOG ( log_date DATE
                                , action VARCHAR2(50));
  2. 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 AI 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.

Para crear el disparador NEW_EVALUATION:

  1. En el marco Conexiones, expanda hr_conn.

  2. En la lista de tipos de objetos de esquema, haga clic con el botón derecho en Disparadores.

  3. En la lista de opciones, haga clic en Nuevo disparador.

  4. En la ventana Create Trigger:

    1. En el campo Nombre, escriba NEW_EVALUATION_TRIGGER sobre el valor por defecto TRIGGER1.

    2. Para el objeto base, seleccione EVALUATIONS en el menú.

    3. Mover INSERT de Eventos disponibles a Eventos seleccionados.

      (Seleccione INSERT y haga clic en >).

    4. Anule la selección de la opción Statement Level.

    5. Haga clic en 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.

  5. En la sentencia CREATE TRIGGER, reemplace NULL con lo siguiente:

    :NEW.evaluation_id := evaluations_sequence.NEXTVAL
  6. En el menú Archivo, seleccione Guardar.

    La base de datos compila el procedimiento y lo guarda. 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:

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.

Para crear HR_USERS_LOG, HR_LOGON_TRIGGER y HR_LOGOFF_TRIGGER:

  1. Cree la tabla HR_USERS_LOG:

    CREATE TABLE hr_users_log (
      user_name VARCHAR2(30),
      activity VARCHAR2(20),
      event_date DATE
    );
  2. 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;
  3. 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 AI Database para obtener más información sobre los disparadores del sistema