0
2

More than 1 year has passed since last update.

SQLのトリガー、ビュー

Posted at

トリガー

・テーブルのデータ操作(INSERT/UPDATE/DELETE)した時に自動的に実行する機能
・アプリケーションには依存しないしないもので、トリガーを定義しておけばデータの整合性を保つようにすることができる
・データ操作を頻繁に行うアプリでトリガーを太陽するとパフォーマンスが低下することがある
・アプリではトリガーがどのような処理をするか分からないためトリガーの処理内容を把握してないと、保守性が低下する
・トリガー内でCOMMITを行うと、上位のトランザクションでROLLBACKができなくなる


基本構文

CREATE [ OR REPLACE ] TRIGGER トリガー名
    { BEFORE | AFTER | INSTEAD OF }
    { INSERT | UPDATE [OF 列名,...] | DELETE } [OR {INSERT | UPDATE [OF 列名,...] | DELETE }]
    ON テーブル名
    [ FOR EACH ROW ]
    [ WHEN 条件式 ]
    BEGIN
      --処理
    END ;
パラメータ 説明
1 OR REPLACE 同じ名前のトリガーが既に存在するときに上書き
2 BEFORE / AFTER / INSTEAD OF トリガーがいつ起動するのかを指定するキーワード
3 BEFORE データ操作文が実行される前にトリガーを起動
4 AFTER データ操作文が実行された後にトリガーを起動
5 INSTEAD OF データ操作文は実行されず、トリガーだけを起動
6 INSERT / UPDATE [OF 列名,...] / DELETE 3つのデータ操作文の内どれか発行されたときにトリガーが起動するのかを指定
7 UPDATE [OF 列名,...] 指定した列が更新された場合にだけトリガーを起動
複数のデータ操作文を指定することができる
8 ON テーブルに対するデータ操作文が発行された時にトリガーを起動するのかを指定
9 FOR EACH ROW 複数行に対するデータ操作文が発行されるとき、各行ごとにトリガーが起動
指定しない場合は複数行に対するデータ操作文が発行されても、トリガーは一度だけしか起動されない
10 WHEN 指定された条件を満たす場合のみ、トリガーを起動するように設定するもの

トリガー作成

CREATE OR REPLACE TRIGGER トリガー名
    BEFORE INSERT or UPDATE ON テーブル名 FOR EACH ROW WHEN テーブル名.カラム1 IS NOT NULL
    BEGIN
        INSERT INTO テーブル名 values('1','INSERT',sysdate);
        if inserting then
            INSERT INTO テーブル名 values('2','INSERT',sysdate);
        elsif updating then
            INSERT INTO テーブル名 values('3','UPDATE',sysdate);
        else
            INSERT INTO テーブル名 values('4','DELETE',sysdate);
        end if;
    END;

トリガー削除

DROP TRIGGER トリガー名

トリガー有効、無効設定

--有効にする方法
ALTER TRIGGER トリガー名 ENABLE;

--無効にする方法
ALTER TRIGGER トリガー名 DISABLE;

トリガー情報参照

SELECT * FROM トリガー名

ビュー

・Viewは仮想テーブルでView作成時に定義したSELECT文が保存されているため、
 Viewに定義しておけば毎回複雑なクエリを実行せずにデータ抽出ができる
・ユーザから参照しやすいように各テーブルを加工しユーザに必要な部分だけ見せるようにできる
・テーブルの一部、複数テーブルの結合した物を1つのテーブルをして見せることができる
・実テーブルのデータへのアクセスを制限することができ、不用意な更新を防ぐことができる
・Viewの中で複雑な処理が行われているため、メモリ領域を圧迫してパフォーマンス低下させる可能性がある


作成

CREATE VIEW ビュー名 AS SELECT;

削除

DROP VIEW ビュー名;

変更

ALTER VIEW ビュー名 AS SELECT;

参照

--通常テーブル参照と同じ
SELECT * FROM ビュー名;

詳細情報確認

--ビューの作成日時、定義しているSELECT文等を確認できる
SELECT * FROM views WHERE table_name = 'ビュー名';

更新

--通常テーブル登録、更新、削除と同じ
UPDATE ビュー名 SET カラム1='A' WHERE;

下記条件の場合、登録、更新、削除できない
・ビューの定義に集約関数を含む。(集約値なので直接変更できない)
・ビューの定義にGROUP BY句、HAVING句を含む。(同上)
・複数の表を結合している。(複数表の結合なので直接変更はできない)
・副問合せで同一の表を参照している。(変更する行を特定できない)
・DISTINCTを利用している。(変更する行を特定できない)
・ビュー定義時にWITH READ ONLYの指定をしている。(読み取り専用)


0
2
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
2