PL/SQLのトリガーとは何ですか?トリガーは、insert、update、deleteなどのDML文が表で実行されたとき、または一部のイベントが発生したときにOracle engineによって自動的に起動される格納されたプログ トリガーの場合に実行されるコードは、要件に従って定義できます。 トリガーを起動する必要があるイベントと実行のタイミングを選択できます。 Triggerの目的は、データベース上の情報の整合性を維持することです。
このチュートリアルでは、次のことを学びます-
- トリガーの利点
- Oracleのトリガーの種類
- トリガーを作成する方法
- :NEWおよび:OLD句
- Instead OF Trigger
- Compound Trigger
トリガーの利点
トリガーの利点は次のとおりです。
- いくつかの派生列値を自動的に生成する
- 参照整合性の強制
- イベントロギングとテーブルアクセスに関する情報の格納
- 監査
- 表の同期レ
- タイミングに基づく分類
- Before Trigger:指定されたイベントが発生する前に起動します。
- AFTER Trigger:指定されたイベントが発生した後に起動します。
- トリガーの代わりに:特別なタイプ。 あなたは、さらなるトピックについての詳細を学びます。 (DMLの場合のみ)
- レベルに基づく分類
- ステートメントレベルのトリガー:指定されたeventステートメントに対して一度起動します。
- 行レベルトリガー:指定されたイベントで影響を受けた各レコードに対して起動します。 (DMLの場合のみ)
- イベントに基づく分類
- DMLトリガー:DMLイベントが指定されたときに起動します(INSERT/UPDATE/DELETE)
- DDLトリガー: DDLイベントが指定されたときに起動します(CREATE/ALTER)
- DATABASE Trigger:データベースイベントが指定されたときに起動します(LOGON/LOGOFF/STARTUP/SHUTDOWN)
各トリガーは上記のパラメータの組
トリガーを作成する方法
以下は、トリガーを作成するための構文です。 P>
CREATE TRIGGER <trigger_name> ON<name of underlying object> DECLARE<Declaration part>BEGIN<Execution part> EXCEPTION<Exception handling part> END;
構文の説明:
- 上記の構文は、トリガーの作成に存在するさまざまなオプショ
- BEFORE/AFTERはイベントのタイミングを指定します。
- INSERT/UPDATE/LOGON/CREATE/etc. トリガーを起動する必要があるイベントを指定します。
- ON句は、上記のイベントが有効であるオブジェクトを指定します。 たとえば、これは、DMLトリガーの場合にDMLイベントが発生する可能性のあるテーブル名になります。
- コマンド”FOR EACH ROW”は、行レベルのトリガーを指定します。
- WHEN句は、トリガーを起動する必要がある追加の条件を指定します。宣言部分、実行部分、例外処理部分は、他のPL/SQLブロックと同じです。 宣言部分と例外処理部分は省略可能です。
:NEW And:OLD Clause
行レベルのトリガーでは、トリガーは関連する行ごとに起動します。 また、DML文の前後の値を知る必要がある場合もあります。
オラクルは、これらの値を保持するために、レコードレベルのトリガーに二つの句を提供しています。 これらの句を使用して、トリガー本体内の古い値と新しい値を参照できます。
-
- :NEW–トリガーの実行中にベース表/ビューの列の新しい値を保持します
- :OLD-トリガーの実行中にベース表/ビューの列の古い値を保持します
- Table_1はempテーブルであり、
- Table_2は部門テーブルです。 次に、INSTEAD OFトリガーを使用して、この複雑なビューでupdate location detailステートメントを発行する方法を確認します。 また、:NEWと:OLDがトリガーでどのように役立つかを見ていきます。
- ステップ1: 適切な列を持つテーブル’emp’および’dept’の作成
- ステップ2:サンプル値をテーブルに移入する
- ステップ3:上記の作成されたテーブルのビューの作成
- ステップ4:instead-ofトリガー
- ステップ5:instead-ofトリガー
- ステップ6:instead-ofトリガー
ステップ1)instead-ofトリガー
この句は、DMLイベン 以下の表では、どのDML文(INSERT/UPDATE/DELETE)に対して有効な句を指定します。 /td>
挿入 更新 削除 :新しい 有効 有効 無効です。 :新しい 有効 有効 無効です。 :新しい 有効 無効です。 :新しい 有効 無効です。 :新しい 有効 無効です。 Delete caseには新しい値はありません。 :古い 無効です。 挿入ケースに古い値はありません VALID VALID INSTEAD OF Trigger
“INSTEAD OF trigger”は特別なタイプのトリガーです。 これは、DMLトリガーでのみ使用されます。 これは、複合ビューでDMLイベントが発生する場合に使用されます。
3つのベーステーブルからビューを作成する例を考えてみましょう。 このビューでDMLイベントが発行されると、データは3つの異なるテーブルから取得されるため、無効になります。 したがって、この代わりにトリガーが使用されます。 INSTEAD OFトリガーは、指定されたイベントのビューを変更するのではなく、ベーステーブルを直接変更するために使用されます。
例1:この例では、2つのベーステーブルから複雑なビューを作成します。
ステップ1)instead-ofトリガー
ステップ2)instead-ofトリガー
- タイミングに基づく分類
ステップ3)instead-ofトリガー
ステップ3)instead-ofトリガー
ステップ3)instead-ofトリガー
ステップ3)instead-ofトリガー
ステップ3)instead-ofトリガー
適切な列
CREATE TABLE emp(emp_no NUMBER,emp_name VARCHAR2(50),salary NUMBER,manager VARCHAR2(50),dept_no NUMBER);/CREATE TABLE dept( Dept_no NUMBER, Dept_name VARCHAR2(50),LOCATION VARCHAR2(50));/
コードの説明
- コード行1-7: テーブル’emp’の作成。
- コード行8-12:テーブル’dept’の作成。ステップ2)テーブルを作成したので、このテーブルにサンプル値と上記のテーブルのビューの作成を設定します。 PL/SQLのトリガー
BEGININSERT INTO DEPT VALUES(10,‘HR’,‘USA’);INSERT INTO DEPT VALUES(20,'SALES','UK’);INSERT INTO DEPT VALUES(30,‘FINANCIAL',‘JAPAN'); COMMIT;END;/BEGININSERT INTO EMP VALUES(1000,'XXX5,15000,'AAA',30);INSERT INTO EMP VALUES(1001,‘YYY5,18000,‘AAA’,20) ;INSERT INTO EMP VALUES(1002,‘ZZZ5,20000,‘AAA',10); COMMIT;END;/
コードの説明
- コード行13-19:’dept’テーブルにデータを挿入します。
- コード行20-26:’emp’テーブルにデータを挿入します。PL/SQLプロシージャが完了しました。
ステップ3)上記の作成された表のビューを作成します。 PL/SQLのトリガー
CREATE VIEW guru99_emp_view(Employee_name:dept_name,location) ASSELECT emp.emp_name,dept.dept_name,dept.locationFROM emp,deptWHERE emp.dept_no=dept.dept_no;/
SELECT * FROM guru99_emp_view;
コード説明
- コード行27-32:’guru99_emp_view’ビュー。
- コード行33:guru99_emp_viewを照会します。
Output
View created
EMPLOYEE_NAME DEPT_NAME LOCATION ZZZ HR USA YYY SALES UK XXX FINANCIAL JAPAN Step 4) Update of view before instead-of trigger.
BEGINUPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name=:'XXX’;COMMIT;END;/
Code Explanation
- Code line 34-38: Update the location of “XXX” to ‘FRANCE’. Dml文が複合ビューで許可されていないため、例外が発生しました。 ORA-01779:キー保存されていない表にマップされる列を変更できません
Ora-06512:2行目
ステップ5)前のステップでビューの更新中にエラーが発生しないようにするには、このステップでは”instead of trigger.”を使用します。 PL/SQLのトリガー
CREATE TRIGGER guru99_view_modify_trgINSTEAD OF UPDATEON guru99_emp_viewFOR EACH ROWBEGINUPDATE deptSET location=:new.locationWHERE dept_name=:old.dept_name;END;/
コードの説明
- コード行39: 行レベルの’guru99_emp_view’ビューで’UPDATE’イベントのINSTEAD OFトリガーを作成します。 これには、ベーステーブル’dept’の場所を更新するupdate文が含まれています。
- コード行44:Updateステートメントは、’:NEW’と’:OLD’を使用して、更新の前後の列の値を検索します。
出力
トリガーが作成されました
ステップ6)instead-ofトリガーの後のビューの更新。 これで、”instead of trigger”がこの複雑なビューの更新操作を処理するため、エラーは発生しません。 そして、コードが実行されると、従業員XXXの場所は「日本」から「フランス」に更新されます。 PL/SQLのトリガー
BEGINUPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name='XXX'; COMMIT;END;/
SELECT * FROM guru99_emp_view;
コードの説明:
- コード行49-53:”XXX”の場所の更新”フランス”へ。 これは、’INSTEAD OF’トリガーがビューで実際のupdateステートメントを停止し、ベーステーブルの更新を実行したために成功しました。
- コード行55:更新されたレコードを確認します。
出力: /td>
PL/SQLプロシージャが正常に完了しました EMPLOYEE_NAME DEPT_NAME 場所 ZZZ HR USA EMPLOYEE_NAME EMPLOYEE_NAME ZZZ HR USA yyy sales uk xxx financial france compound trigger
compound triggerは、単一のトリガー本体内の四つのタイミングポイントごとにアクショ それがサポートする4つの異なるタイミングポイントは以下の通りです。
- BEFORE STATEMENT–level
- BEFORE ROW–level
- AFTER ROW-level
- AFTER STATEMENT–level
異なるタイミングのアクションを同じトリガーに結合する機能を提供します。 P>
CREATE TRIGGER <trigger_name> FORON <name of underlying object><Declarative part> BEFORE STATEMENT ISBEGIN<Execution part>;END BEFORE STATEMENT;BEFORE EACH ROW ISBEGIN<Execution part>;END EACH ROW;AFTER EACH ROW ISBEGIN<Execution part>;END AFTER EACH ROW;AFTER STATEMENT ISBEGIN<Execution part>;END AFTER STATEMENT;END;
構文の説明:
- 上記の構文は、’複合’トリガーの作成を示しています。
- 宣言セクションは、トリガー本体内のすべての実行ブロックに共通です。
- これらの4つのタイミングブロックは、任意の順序にすることができます。 これらの4つのタイミングブロックをすべて持つことは必須ではありません。 必要なタイミングに対してのみ複合トリガを作成できます。例1:この例では、salary列にデフォルト値5000を自動入力するトリガーを作成します。 PL/SQLのトリガー
CREATE TRIGGER emp_trig FOR INSERT ON empCOMPOUND TRIGGER BEFORE EACH ROW IS BEGIN:new.salary:=5000;END BEFORE EACH ROW;END emp_trig;/
BEGININSERT INTO EMP VALUES(1004,‘CCC’,15000,‘AAA’,30); COMMIT;END;/
SELECT * FROM emp WHERE emp_no=1004;
コードの説明:
- コード行2-10:複合トリガの作成。 これは、給与にデフォルト値5000を設定するために、行レベルの前のタイミング用に作成されます。 これにより、レコードをテーブルに挿入する前に、給与がデフォルト値’5000’に変更されます。
- コード行11-14:レコードを’emp’テーブルに挿入します。
- コード行16:挿入されたレコードを検証します。
出力:
トリガーが作成されました
PL/SQLプロシージャが正常に完了しました。 /td>
1004 5000 AAA 30 1004 1004 1004 1004 1004 1004 1004 1004 1004 1004 1004 1004 1004 1004 1004 1004 1004 1004 1004 /td>
トリガーの有効化と無効化
トリガーは有効または無効にできます。 トリガーを有効または無効にするには、トリガーを無効または有効にするALTER(DDL)文を指定する必要があります。 トリガーを有効/無効にするための構文は次のとおりです。
ALTER TRIGGER <trigger_name> ;ALTER TABLE <table_name> ALL TRIGGERS;
構文の説明:
- 最初の構文は、単一のトリガーを有効/無効にする方法を示しています。
- 2番目のステートメントは、特定のテーブルのすべてのトリガーを有効/無効にする方法を示しています。この章では、PL/SQLトリガーとその利点について学習しました。 また、トリガーと複合トリガーの代わりに、さまざまな分類を学び、議論しました。