トリガーの作成

トリガーを作成するには、SQL Developerのグラフィカル・インタフェースまたはDDL文CREATE TRIGGERのいずれかを使用します。

ここでは、これらの方法を使用してトリガーを作成する方法について説明します。

デフォルトでは、トリガーは有効な状態で作成されます。無効な状態のトリガーを作成するには、DISABLE句が含まれるCREATE TRIGGER文を使用します。

ノート:トリガーを作成するには、適切な権限を所持ちする必要がありますが、この説明で、この追加情報は必要ありません。

ノート:このドキュメントのチュートリアルを実行するには、SQL DeveloperからユーザーHRとしてOracle Databaseに接続する必要があります。

関連情報:

擬似レコードOLDおよびNEWについて

行レベルのトリガーが起動すると、PL/SQLランタイム・システムによって、OLDおよびNEWという2つの擬似レコードが作成され、移入されます。これらは、レコードのすべてではなく一部のプロパティを持っているため、擬似レコードと呼ばれます。

擬似レコードの値は、トリガーが行う処理の種類に応じて次のように設定されます。

疑似コードを参照するには、例6-1のように、name-:OLDまたは:NEWと名前の前にコロンを付けます

関連項目: OLDおよびNEW疑似レコードの詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。

チュートリアル: 表の変更を記録するトリガーの作成

このチュートリアルでは、CREATE TRIGGER文を使用して、INSERT文、UPDATE文またはDELETE文によりEVALUATIONS表が変更されるたびにEVALUATIONS_LOG表に行を追加するトリガーEVAL_CHANGE_TRIGGERを作成する方法について説明します。

このトリガーはトリガー文が実行されたに行を追加し、条件述語 INSERTINGUPDATING、およびDELETINGを使用して、考えられる3つのDML文の中からトリガーを起動したDML文を判別します。

EVAL_CHANGE_TRIGGERは文レベルのトリガーで、AFTERトリガーです。

EVALUATIONS_LOGおよびEVAL_CHANGE_TRIGGERを作成するには:

  1. EVALUATIONS_LOG表を作成します。

     CREATE TABLE EVALUATIONS_LOG ( log_date DATE
                                 , action VARCHAR2(50));
    
  2. 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トリガーを作成するステップ:

  1. 「接続」フレーム内で、hr_connを展開します。

  2. スキーマ・オブジェクト・タイプのリスト内で、「トリガー」を右クリックします。

  3. 選択肢のリストで、「新規トリガー」を選択します。

  4. 「トリガーの作成」ウィンドウで、次の手順を実行します。

    1. 「名前」フィールドで、NEW_EVALUATION_TRIGGERと入力してデフォルト値を上書きしますTRIGGER1.

    2. ベース・オブジェクトでは、メニューからEVALUATIONSを選択してください。

    3. INSERTを「使用可能なイベント」から「選択済のイベント」に移動します。

      (「INSERT」を選択し、「>」を選択します。)

    4. 「文レベル」オプションを選択解除します。

    5. 「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ペインのタイトルがイタリック・フォントになっています。トリガーがまだデータベースに保存されていないことを示しています。

  5. CREATE TRIGGER文では、NULLを次のテキストで置き換えます。

     :NEW.evaluation_id := evaluations_sequence.NEXTVAL
    
  6. 「ファイル」メニューから、「保存」をクリックします。

    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;

関連情報:

チュートリアル: 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を作成するステップ:

  1. HR_USERS_LOG表を作成します。

     CREATE TABLE hr_users_log (
       user_name VARCHAR2(30),
       activity VARCHAR2(20),
       event_date DATE
     );
    
  2. 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. 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言語リファレンス』を参照してください。