Creazione di trigger

Per creare TRIGGER, utilizzare l'interfaccia grafica di SQL Developer o l'istruzione DDL CREATE TRIGGER.

Questa sezione descrive come creare i trigger utilizzando entrambi i modi.

Per impostazione predefinita, un trigger viene creato nello stato abilitato. Per creare un TRIGGER nello stato disabilitato, utilizzare l'istruzione CREATE TRIGGER con la clausola DISABLE.

Nota: per creare i trigger, è necessario disporre di privilegi appropriati; tuttavia, tali informazioni aggiuntive non è necessario per la descrizione fornita nel presente ambito o per le applicazioni Semplici.

Nota: per eseguire le esercitazioni riportate nel presente documento è necessario aver definito la connessione a Oracle Database come utente HR da SQL Developer.

Vedere anche:

Informazioni sugli pseudorecord OLD e NEW

Quando viene attivato un trigger a livello di riga, il sistema in fase di esecuzione di PL/SQL crea e popola i due pseudorecord OLD e NEW. Sono denominati pseudorecord perché hanno solo alcune delle proprietà dei record.

Per la riga che il trigger sta elaborando:

Per far riferimento a uno pseudorecord, inserire i due punto prima del nome (:OLD o :NEW) come descritto nell'Esempio 6-1.

Vedi anche: Oracle Database PL/SQL Language Reference per ulteriori informazioni sugli pseudorecord OLD e NEW

Esercitazione: Creazione di un trigger che registra le modifiche alla tabella

Questa esercitazione mostra come utilizzare l'istruzione CREATE TRIGGER per creare un TRIGGER, EVAL_CHANGE_TRIGGER, che aggiunge una riga alla tabella EVALUATIONS_LOG ogni volta in cui un'istruzione INSERT, UPDATE o DELETE modifica la tabella EVALUATIONS.

Il trigger aggiunge la riga dopo l'esecuzione dell'istruzione di attivazione e utilizza i predicati condizionali INSERTING , UPDATING e DELETING per determinare quali delle tre possibili istruzioni DML ha avviato il trigger.

EVAL_CHANGE_TRIGGER è un trigger a livello d'istruzione e un trigger AFTH.

Per creare EVALUATIONS_LOG e EVAL_CHANGE_TRIGGER:

  1. Creare la tabella EVALUATIONS_LOG:

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

Per ulteriori informazioni sui predicati condizionali, vedere anche: Oracle Database PL/SQL Language Reference

Esercitazione: Creazione di un trigger che genera una chiave primaria per una riga prima dell'inserimento

Questa esercitazione mostra come utilizzare lo strumento Crea trigger SQL Developer per creare un trigger denominato EVALUATIONS, che viene avviato prima dell'inserimento di una riga in una tabella EVALUATIONS e genera il numero univoco per la chiave primaria di tale riga utilizzando EVALUATIONS_SEQUENCE.

La sequenza EVALUATIONS_SEQUENCE (creata in "Esercitazione: creazione di una sequenza") genera chiavi primarie per la tabella EVALUATIONS (creata in). Tuttavia, tali chiavi primarie non vengono inserite nella tabella automaticamente.

Questa esercitazione mostra come utilizzare lo strumento Crea grilletto di SQL Developer per creare un trigger denominato NEW_EVALUATION_TRIGGER, che viene attivato prima dell'inserimento di una riga sulla tabella EVALUATIONS e genera il numero univoco per la chiave primaria di tale riga utilizzando EVALUATIONS_SEQUENCE. Il trigger viene avviato una volta per ogni riga interessata dall'attivazione del trigger per l'istruzione INSERT.

NEW_EVALUATION_TRIGGER è un trigger a livello della riga e un trigger BEFERE.

Per creare il trigger NEW_EVALUATION:

  1. Nel frame Connessioni espandere hr_conn.

  2. Nella lista dei tipi di oggetto schema, fare clic con il pulsante destro del mouse su Trigger.

  3. Nell'elenco di opzioni, selezionare Nuovo trigger.

  4. Nella finestra Crea trigger:

    1. Nel campo Nome digitare NEW_EVALUATION_TRIGGER sopra il valore predefinito TRIGGER1.

    2. Per Oggetto base, selezionare EVALUATIONS dal menu.

    3. Spostare INSERT da Eventi disponibili a Eventi selezionati.

      Selezionare INSERIRE e selezionare >.

    4. Deselezionare l'opzione Livello rendiconto.

    5. Selezionare OK.

      Viene aperto il riquadro NEW_EVALUATION_TRIGGER che mostra l'istruzione CREATE TRIGGER che ha creato il TRIGGER:

       CREATE OR REPLACE
      
       TRIGGER NEW_EVALUATION_TRIGGER
      
       BEFORE INSERT ON EVALUATIONS
      
       FOR EACH ROW
      
       BEGIN
      
         NULL;
      
       END;
      

      Il titolo del riquadro NEW_EVALUATION_TRIGGER è in corsiva, a indicare che il trigger non è stato ancora salvato nel database.

  5. Nell'istruzione CREATE TRIGGER, sostituire NULL con il testo seguente:

     :NEW.evaluation_id := evaluations_sequence.NEXTVAL
    
  6. Dal menu File, selezionare Salva.

    Oracle Database compila la procedura e la salva. Il titolo del riquadro NEW_EVALUATION_TRIGGER non è più in corsivo.

Creazione di un trigger INSTEAD OF

Una vista presenta l'output di una query come tabella. Se si desidera modificare una vista nel modo nel quale si modifica una tabella, è necessario creare trigger INSTEAD OF. Invece di modificare la vista, tali trigger modificano le tabelle di base.

Ad esempio, si consideri la vista EMP_LOCATIONS, la quale colonna NAME viene creata dalle colonne LAST_NAME e FIRST_NAME della tabella 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;

Per aggiornare la vista EMP_LOCATIONS.NAME (creata in "Creazione di viste con l'istruzione CREATE VIEW"), è necessario aggiornare EMPLOYEES.LAST_NAME e EMPLOYEES.FIRST_NAME. Questo è ciò che fa il trigger INSTEAD OF nell'Esempio 6-1.

NEW e OLD sono pseudorecord che il motore runtime di PL/SQL crea e popola ogni volta che viene attivato un trigger a livello di riga. VECCHIO e NUOVO memorizzano rispettivamente il valore originale e il valore nuovo del record elaborato dal trigger. Sono chiamati pseudorecord perché non hanno tutte le proprietà dei record PL/SQL.

Esempio 6-1 Creazione di un trigger 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;

Vedere anche:

Esercitazione: Creazione di trigger che registrano gli eventi LOGON e LOGOFF

Questa esercitazione mostra come utilizzare l'istruzione CREATE TRIGGER per creare due TRIGGER, HR_LOGON_TRIGGER e HR_LOGOFF_TRIGGER. Dopo che qualcuno si collega come utente HR, HR_LOGON_TRIGGER aggiunge una riga alla tabella HR_USERS_LOG. Prima che qualcuno si scolleghi come utente HR, HR_LOGOFF_TRIGGER aggiunge una riga alla tabella HR_USERS_LOG.

HR_LOGON_TRIGGER e HR_LOGOFF_TRIGGER sono trigger del sistema. HR_LOGON_TRIGGER è un trigger AFTER e HR_LOGOFF_TRIGGER è un trigger BEFORE.

Passi per creare HR_USERS_LOG, HR_LOGON_TRIGGER e HR_LOGOFF_TRIGGER:

  1. Creare la tabella HR_USERS_LOG:

     CREATE TABLE hr_users_log (
       user_name VARCHAR2(30),
       activity VARCHAR2(20),
       event_date DATE
     );
    
  2. Crea 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. Crea 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;
    

Per ulteriori informazioni sui trigger di sistema, vedere anche: Oracle Database PL/SQL Language Reference