1.トリガーとは
データベーストリガーは、テーブルに関連付けられたストアドPL / SQLステートメントです。指定されたテーブルで特定のデータ操作ステートメント(挿入、更新、削除)が発行されると、トリガーで定義された一連のステートメントが自動的に実行されます。
トリガーの適用シナリオは次のとおりです。
- 複雑なセキュリティチェック
- データの確認
- データベース監査
- データのバックアップと監査
次に、Oracleトリガーを作成するための構文
CREATE [ OR REPLACE ] TRIGGER trigger_name {BEFORE | AFTER} { INSERT | 削除 | UPDATE [ OF column [、column… ] ]} [ OR {INSERT | 削除| UPDATE [OF column [、column… ] ]} ...] ON [ スキーマ。] table_name | [ スキーマ。] view_name [ REFERENCING {OLD [AS ] old | NEW [ AS ] new | 親として親}] [ EACH ROW FOR ] [ 条件] PL / SQL_BLOCK | CALL procedure_name;
それらの中で:
- BEFOREとAFTERは、トリガーのトリガータイミングがプレトリガーモードとポストトリガーモードであることを示します。プレトリガーは、トリガーイベントを実行する前に現在作成されているトリガーをトリガーし、ポストトリガーは、トリガーイベントの実行後に現在作成されているトリガーをトリガーします。
- FOR EACH ROWオプションは、トリガーが行トリガーであることを示します。
- 行トリガーとステートメントトリガーの違いは、次のとおりです。行トリガーでは、DMLステートメントがデータベース内の複数のデータ行を削除するときに、各データ行について、トリガー制約を満たす限り、一度アクティブ化する必要があります。ステートメントトリガーは、ステートメント操作全体をトリガーイベントとして受け取り、制約を満たしたときにトリガーが1回アクティブになります。
- FOR EACH ROWオプションが省略されている場合、BEFOREおよびAFTERトリガーはステートメントトリガーですが、INSTEAD OFトリガーは行トリガーのみになります
- REFERENCING句は関連する名前を記述します。行トリガーのPL / SQLブロックとWHEN句で関連する名前を使用して、現在の新しい列の値と古い列の値を参照できます。デフォルトの関連する名前はそれぞれOLDとNEWです。トリガーのPL / SQLブロックで関連する名前を適用する場合、それらの前にコロン(:)を追加する必要がありますが、WHEN句にコロンを追加することはできません。
- WHEN句はトリガー制約を指定します。Conditionが論理式の場合は、クエリステートメントではなく、関連する名前を含めたり、PL / SQL関数を呼び出したりする必要があります。WHEN句で指定されたトリガー制約は、BEFOREおよびAFTER行トリガーでのみ使用でき、INSTEAD OF行トリガーおよびその他のタイプのトリガーでは使用できません。
- ベーステーブルが変更されると(INSERT、UPDATE、DELETE)、実行されるストアドプロシージャは、アタッチされているベーステーブルの変更に従って自動的にトリガーされるため、アプリケーションとは関係なく、データベーストリガーによってデータの一貫性を確保できます。そして誠実さ。
3、Oracleトリガーのタイプ
- 行レベルのトリガー:DMLステートメントの影響を受ける行ごとに1回実行されます。たとえば、更新ステートメントは100データを更新します。更新に行レベルのトリガーを定義すると、行レベルのトリガーは100回トリガーされます。
- ステートメントレベルのトリガー:DMLステートメントごとに1回実行されます。たとえば、更新ステートメントは200データを更新します。更新用にステートメントレベルのトリガーを定義すると、ステートメントレベルのトリガーは1回トリガーされます。
第4に、データベーストリガーを使用して複雑なセキュリティチェックを実行する
/ * 複雑なセキュリティチェックを実装します。 非勤務時間中に新しい従業員を挿入することは禁止されています。 週末:仕事の前後の( 'Saturday'、 'Sunday')でto_char(sysdate、 'day') :to_number(to_char(sysdate、 'hh24 '))ではない9〜18 * / 作成 または 交換する トリガーsecurityemp 前にINSERT ONにEMP 始める IF TO_CHAR(SYSDATE、' 日')で(' 土曜日' ' 日曜日')または TO_NUMBER(TO_CHAR(SYSDATE、' HH24 "))9 と18の間ではない その後、 - 禁止の挿入操作は、例外スロー (RAISE_APPLICATION_ERROR - 20001を、「非稼働時間中に新しい従業員の挿入を禁止する」;) エンド IF ; エンド; /
- 上記の例では、非勤務時間中の新しい従業員の挿入を禁止しているため、insertステートメントを実行するときにセキュリティチェックが実装されます。