トリガー
・テーブルのデータ操作(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の指定をしている。(読み取り専用)