トリガーの作成
トリガーを作成するには、SQL Developerのグラフィカル・インタフェースまたはDDL文CREATE TRIGGERのいずれかを使用します。
ここでは、これらの方法を使用してトリガーを作成する方法について説明します。
デフォルトでは、トリガーは有効な状態で作成されます。無効な状態のトリガーを作成するには、DISABLE句が含まれるCREATE TRIGGER文を使用します。
ノート:トリガーを作成するには、適切な権限を所持ちする必要がありますが、この説明で、この追加情報は必要ありません。
ノート:このドキュメントのチュートリアルを実行するには、SQL DeveloperからユーザーHRとしてOracle Databaseに接続する必要があります。
関連情報:
-
CREATE TRIGGER文の詳細は、Oracle Database PL/SQL言語リファレンスを参照してください。
擬似レコードOLDおよびNEWについて
行レベルのトリガーが起動すると、PL/SQLランタイム・システムによって、OLDおよびNEWという2つの擬似レコードが作成され、移入されます。これらは、レコードのすべてではなく一部のプロパティを持っているため、擬似レコードと呼ばれます。
擬似レコードの値は、トリガーが行う処理の種類に応じて次のように設定されます。
-
INSERTトリガーの場合、OLDには値が入らず、NEWには新しい値が入っています。
-
UPDATEトリガーの場合、OLDには古い値が、NEWには新しい値が入ります。
-
DELETEトリガーの場合、OLDに古い値が入り、NEWには値が入りません。
疑似コードを参照するには、例6-1のように、name-:OLDまたは:NEWと名前の前にコロンを付けます
関連項目: OLDおよびNEW疑似レコードの詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。
チュートリアル: 表の変更を記録するトリガーの作成
このチュートリアルでは、CREATE TRIGGER文を使用して、INSERT文、UPDATE文またはDELETE文によりEVALUATIONS表が変更されるたびにEVALUATIONS_LOG表に行を追加するトリガーEVAL_CHANGE_TRIGGERを作成する方法について説明します。
このトリガーはトリガー文が実行された後に行を追加し、条件述語 INSERTING、UPDATING、およびDELETINGを使用して、考えられる3つのDML文の中からトリガーを起動したDML文を判別します。
EVAL_CHANGE_TRIGGERは文レベルのトリガーで、AFTERトリガーです。
EVALUATIONS_LOGおよびEVAL_CHANGE_TRIGGERを作成するには:
-
EVALUATIONS_LOG表を作成します。
CREATE TABLE EVALUATIONS_LOG ( log_date DATE , action VARCHAR2(50)); -
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;
関連項目:条件述語の詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。
チュートリアル: 行を挿入する前に行に対して主キーを生成するトリガーの作成
このチュートリアルでは、SQL Developerのトリガーの作成ツールを使用して、EVALUATIONS表に行が挿入される前に起動し、EVALUATIONS_SEQUENCEを使用して、その行の主キーに対する一意の番号を生成するトリガーを作成する方法を説明します。
(「チュートリアル: 順序の作成」で作成した)順序EVALUATIONS_SEQUENCEは、(1「表の作成」3で作成した)EVALUATIONSテーブルの主キーを生成します。ただし、これらの主キーは表には自動的に挿入されません。
このチュートリアルでは、SQL Developerのトリガー作成ツールを使用してNEW_EVALUATION_TRIGGERという名前のトリガーを作成する方法を示します。このトリガーは、行がEVALUATIONS表に挿入される前に起動され、EVALUATIONS_SEQUENCEを使用して、その行の主キーの一意の番号を生成します。INSERT文のトリガーにより各行に対して、このトリガーは一度起動します(行ごとに)。
NEW_EVALUATION_TRIGGERは、行レベルのトリガーで、BEFOREトリガーです。
NEW_EVALUATIONトリガーを作成するステップ:
-
「接続」フレーム内で、hr_connを展開します。
-
スキーマ・オブジェクト・タイプのリスト内で、「トリガー」を右クリックします。
-
選択肢のリストで、「新規トリガー」を選択します。
-
「トリガーの作成」ウィンドウで、次の手順を実行します。
-
「名前」フィールドで、
NEW_EVALUATION_TRIGGERと入力してデフォルト値を上書きしますTRIGGER1. -
ベース・オブジェクトでは、メニューからEVALUATIONSを選択してください。
-
INSERTを「使用可能なイベント」から「選択済のイベント」に移動します。
(「INSERT」を選択し、「>」を選択します。)
-
「文レベル」オプションを選択解除します。
-
「OK」を選択します。
NEW_EVALUATION_TRIGGERペインが開き、トリガーを作成したCREATE TRIGGER文が表示されます:
CREATE OR REPLACE TRIGGER NEW_EVALUATION_TRIGGER BEFORE INSERT ON EVALUATIONS FOR EACH ROW BEGIN NULL; END;NEW_EVALUATION_TRIGGERペインのタイトルがイタリック・フォントになっています。トリガーがまだデータベースに保存されていないことを示しています。
-
-
CREATE TRIGGER文では、NULLを次のテキストで置き換えます。
:NEW.evaluation_id := evaluations_sequence.NEXTVAL -
「ファイル」メニューから、「保存」をクリックします。
Oracle Databaseはプロシージャをコンパイルして保存します。NEW_EVALUATION_TRIGGERペインのタイトルは、イタリック・フォントではなくなりました。
INSTEAD OFトリガーの作成
ビューは問合せを表として出力します。表の変更と同時にビューも変更する場合、INSTEAD OFトリガーを作成する必要があります。ビューは変更されず、基礎となる表が変更されます。
たとえば、EMPLOYEES表のLAST_NAME列およびFIRST_NAME列からNAME列が作成されるEMP_LOCATIONSビューを例に挙げるとします。
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;
ビューEMP_LOCATIONS.NAME (「CREATE VIEW文によるビューの作成」で作成)を更新するには、EMPLOYEES.LAST_NAMEおよびEMPLOYEES.FIRST_NAMEを更新する必要があります。これは、例6-1のINSTEAD OFトリガーによって行われます。
NEWおよびOLDは擬似レコードです。行レベルのトリガーが起動するたびにPL/SQLランタイム・エンジンによって作成され、それぞれ値を入れます。OLDおよびNEWは、トリガーにより処理されるレコードの元の値と新しい値をそれぞれ格納します。PL/SQLレコードのすべてのプロパティをもっているわけではないため、擬似レコードと呼ばれます。
例6-1 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;
関連情報:
-
INSTEAD OFトリガーの詳細は、Oracle Database PL/SQL言語リファレンスを参照してください。
-
OLDおよびNEWの詳細は、Oracle Database PL/SQL言語リファレンスを参照してください。
チュートリアル: LOGONおよびLOGOFFイベントを記録するトリガーの作成
このチュートリアルでは、CREATE TRIGGER文を使用して、HR_LOGON_TRIGGERとHR_LOGOFF_TRIGGERの2つのトリガーを作成する方法を説明します。HR_LOGON_TRIGGERは、ユーザーHRとしてログオンした後、HR_USERS_LOG表に行を追加します。HR_LOGOFF_TRIGGERは、ユーザーHRとしてログオフする前に、HR_USERS_LOG表に行を追加します。
HR_LOGON_TRIGGERおよびHR_LOGOFF_TRIGGERはシステム・トリガーです。HR_LOGON_TRIGGERはAFTERトリガー、HR_LOGOFF_TRIGGERはBEFOREトリガーです。
HR_USERS_LOG、HR_LOGON_TRIGGERおよびHR_LOGOFF_TRIGGERを作成するステップ:
-
HR_USERS_LOG表を作成します。
CREATE TABLE hr_users_log ( user_name VARCHAR2(30), activity VARCHAR2(20), event_date DATE ); -
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; -
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;
関連項目:システム・トリガーの詳細は『Oracle Database PL/SQL言語リファレンス』を参照してください。