PL/SQLトリガー
PL/SQLトリガーは、Oracleに対するなんらかのアクションを引き金として自動起動するプロシージャをいいます。トリガーを使用する主な目的としては、以下が考えられます。
@セキュリティ設定 ⇒ 複雑なセキュリティ設定を実施した場合
A監査設定 ⇒ 更新処理などに対し高度な監査を実施したい場合
B複雑なルール設定 ⇒ 通常制約以外で複雑なルールを設定した場合
◆PL/SQLトリガーの種類
●DMLトリガー
⇒表に対するDML操作(INSERT、UPDATE、DELETE)で起動。トリガーを起動するタイミングによりBEFORE|AFTERトリガーがあります。またトリガーを起動する単位によっても文|行トリガーがあります。
●INSTEAD OF トリガー
⇒ビューに対するDML操作で起動。
●DDLトリガー
⇒DDL操作(CREATE、ALTER、DROP)で起動
●イベントトリガー
⇒データベース処理や特定ユーザ処理で起動
|
◆トリガーの書式
CREATE [OR REPLACE] TRIGGER <トリガー名>
{ BEFORE | AFTER } { DELETE | INSERT | INSERT [ OF <列名> ] } ON <表名>
[ FOR EACH ROW [ WHEN <条件> ] ]
DECLARE
[ <宣言部> ]
BEGIN
<実行部>
[ EXCEPTION <例外処理部> ]
END;
※仕様部が最初の3行まで、4行目以降が本体となります。
※仕様部では、トリガーを起動するタイミングを定義します。
※[ OR REPLACE ]は、同名のプロシージャが既に作成されている場合、上書きして作成します。
※{ BEFORE | AFTER }にはトリガーが起動するタイミングを指定します。
※FOR EACH ROWを指定すると、トリガーが起動する単位が行トリガーなります。指定しない場合は文トリガーとなります。
※SYSが所有しているオブジェクトに対してトリガーは作成できません
|
以下にストアドファンクションのDMLトリガー作成例を示します。
SQL> CREATE OR REPLACE TRIGGER hr.trigger_sample
2 BEFORE INSERT ON hr.trigger_sample_table
3 DECLARE
4 BEGIN
5 raise_application_error(-20001, 'INSERT ERROR ON trigger_sample_table');
6 END;
7 /
トリガーが作成されました。
SQL>
|
※raise_application_errorは独自のエラー・メッセージの定義するプロシージャです。
以下にストアドファンクション作成後の確認方法を示します。
SQL> SET PAGES 1000
SQL> COLUMN object_name FORMAT a30;
SQL> COLUMN object_type FORMAT a30;
SQL> SELECT object_name,object_type,status FROM dba_objects WHERE object_name='TRIGGER_SAMPLE';
OBJECT_NAME OBJECT_TYPE STATUS
------------------------------ ------------------------------ --------------
TRIGGER_SAMPLE TRIGGER VALID
SQL>
SQL> DESC dba_triggers
名前 NULL? 型
----------------------------------------- -------- -------------------------
OWNER VARCHAR2(30)
TRIGGER_NAME VARCHAR2(30)
TRIGGER_TYPE VARCHAR2(16)
TRIGGERING_EVENT VARCHAR2(227)
TABLE_OWNER VARCHAR2(30)
BASE_OBJECT_TYPE VARCHAR2(16)
TABLE_NAME VARCHAR2(30)
COLUMN_NAME VARCHAR2(4000)
REFERENCING_NAMES VARCHAR2(128)
WHEN_CLAUSE VARCHAR2(4000)
STATUS VARCHAR2(8)
DESCRIPTION VARCHAR2(4000)
ACTION_TYPE VARCHAR2(11)
TRIGGER_BODY LONG
CROSSEDITION VARCHAR2(7)
BEFORE_STATEMENT VARCHAR2(3)
BEFORE_ROW VARCHAR2(3)
AFTER_ROW VARCHAR2(3)
AFTER_STATEMENT VARCHAR2(3)
INSTEAD_OF_ROW VARCHAR2(3)
FIRE_ONCE VARCHAR2(3)
APPLY_SERVER_ONLY VARCHAR2(3)
SQL>
SQL> SELECT trigger_name,trigger_type FROM dba_triggers WHERE trigger_name='TRIG
GER_SAMPLE';
TRIGGER_NAME
------------------------------------------------------------
TRIGGER_TYPE
--------------------------------
TRIGGER_SAMPLE
BEFORE STATEMENT
SQL>
|
※トリガーの詳細は、「dba_triggers」と「user_triggers」テーブルで確認できます。
以下にストアドファンクションの実行例を示します。
SQL> INSERT INTO hr.trigger_sample_table VALUES (1,'tname1');
INSERT INTO hr.trigger_sample_table VALUES (1,'tname1')
*
行1でエラーが発生しました。:
ORA-20001: INSERT ERROR ON trigger_sample_table
ORA-06512: "HR.TRIGGER_SAMPLE", 行3
ORA-04088: トリガー'HR.TRIGGER_SAMPLE'の実行中にエラーが発生しました
SQL>
|
※上記からDMLを判断して、ユーザが定義したエラーを出力しているのが分かります。
|
スポンサードリンク
|