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:
-
Oracle Database PL/SQL Language Reference per ulteriori informazioni sull'istruzione CREATE TRIGGER
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 un trigger INSERT, OLD non contiene valori e NEW contiene i nuovi valori.
-
Per un trigger UPDATE, OLD contiene i vecchi valori e NEW contiene i nuovi valori.
-
Per un trigger DELETE, OLD contiene i vecchi valori e NEW non contiene alcun valori.
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:
-
Creare la tabella EVALUATIONS_LOG:
CREATE TABLE EVALUATIONS_LOG ( log_date DATE , action VARCHAR2(50)); -
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:
-
Nel frame Connessioni espandere hr_conn.
-
Nella lista dei tipi di oggetto schema, fare clic con il pulsante destro del mouse su Trigger.
-
Nell'elenco di opzioni, selezionare Nuovo trigger.
-
Nella finestra Crea trigger:
-
Nel campo Nome digitare
NEW_EVALUATION_TRIGGERsopra il valore predefinito TRIGGER1. -
Per Oggetto base, selezionare EVALUATIONS dal menu.
-
Spostare INSERT da Eventi disponibili a Eventi selezionati.
Selezionare INSERIRE e selezionare >.
-
Deselezionare l'opzione Livello rendiconto.
-
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.
-
-
Nell'istruzione CREATE TRIGGER, sostituire NULL con il testo seguente:
:NEW.evaluation_id := evaluations_sequence.NEXTVAL -
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:
-
Oracle Database PL/SQL Language Reference per ulteriori informazioni sui trigger INSTEAD OF
-
Oracle Database PL/SQL Language Reference per ulteriori informazioni sui metodi OLD e NEW
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:
-
Creare la tabella HR_USERS_LOG:
CREATE TABLE hr_users_log ( user_name VARCHAR2(30), activity VARCHAR2(20), event_date DATE ); -
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; -
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