【先生チャオチャン】データベーストリガーを使用して複雑なセキュリティチェックを実装

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ステートメントを実行するときにセキュリティチェックが実装されます。

おすすめ

転載: www.cnblogs.com/collen7788/p/12735706.html