0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Oracle初心者が 誰かが作ったOracleDatabase にTRIGGERが仕込まれているか確認した備忘録

Last updated at Posted at 2019-01-18

Oracle TRIGGER とは

  • Oracleにはトリガーという機能がある。MYSQLにもある。
  • ある条件に合致した操作が行われた場合に、実行されるオブジェクト。
  • 実際のシステムでトリガー使いすぎると、仕組みが複雑になる。
  • TRIGGERとか何してるって資料ないし、嫌気が指しそう。

とりあえず、念の為トリガーの作成基本構文

CREATE OR REPLACE TRIGGER トリガー名 
{BEFORE | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE}
 ON テーブル名 (FOR EACH ROW)
 
BEGIN
 処理を記述(PL/SQL)
END;

えー、なんとなくわかりますね。
次から確認に入ります~。

1.Oracleにトリガーがあるか確認する。

''' SQL で確認ができる。へぇ。
SELECT * FROM USER_TRIGGERS;
[結果]
''' 色々出てきたので省略w
  • USER_TRIGGERS だけで検索を行うと、ダラダラ~と内容がでてきてわかりにくかったため、項目別でSELECTしてみる。
''' 必要な項目だけ、確認する。
SELECT TRIGGER_NAME, TABLE_NAME, STATUS FROM USER_TRIGGERS;
[結果]
TRIGGER_NAME                   TABLE_NAME                     STATUS
------------------------------ ------------------------------ --------
TRM_XXX                        TM_XXX                          ENABLED
TRM_CCC                        TM_CCC                          ENABLED
TRM_AAA                        TM_AAA                          ENABLED
''' STATUS 列が `ENABLED` なら有効。`DISABLED ` なら無効。
''' つまり上記のトリガーは全て動いていることがわかる。

2.指定したトリガーのソースを確認する

  • ソースを確認するのが一番で、何したいのかだいたい想像つく
SELECT TRIGGER_BODY FROM ALL_TRIGGERS WHERE TRIGGER_NAME = 'TRM_XXX';
[結果]
TRIGGER_BODY
--------------------------------------------------------------------------------
BEGIN
	:NEW.N_YMD := TO_NUMBER(TO_CHAR(SYSDATE, 'YYYYMMDD'));
END TRM_XXX
''' トリガーのソースを確認するには`ALL_TRIGGERS`を使い、
''' `TRIGGER_BODY ` でソースのみ確認ができる。

3.トリガーはいつ実行されるのか確認する。

''' `TRIGGER_TYPE` はトリガーを起動するタイミング
''' `TRIGGERING_EVENT` はトリガーを起動するデータベース・イベント
SELECT TRIGGER_NAME,  TRIGGER_TYPE, TRIGGERING_EVENT FROM USER_TRIGGERS;
[結果]
TRIGGER_NAME                   TRIGGER_TYPE     TRIGGERING_EVENT
------------------------------ ---------------- -----------------
TRM_XXX                        BEFORE EACH ROW  INSERT OR UPDATE
TRM_CCC                        BEFORE EACH ROW  INSERT OR UPDATE
TRM_AAA                        BEFORE EACH ROW  INSERT OR UPDATE
''' DBインサートとアップデート前に行うってことがわかった。

確認した結果。

  • 2 と 3 を確認しただけで、何をしているかは想像ついた。
  • 指定したDBをなにかしたら更新するタイミングでSYSDATEを入れるよ。というトリガーがたくさん仕込まれていることがわかった。
  • うん。終了です。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?