Skill Note

平凡なエンジニアがメモ代わりにプログラミング, インフラ, ネットワークを書き綴るブログ

[Oracle]データベーストリガーの作成方法

      2015/12/14

DMLトリガーを作成する

データベーストリガーの中でももっとも一般的なDMLトリガーの作成方法と簡単な使用方法を記載していきます。

トリガーとは?

トリガーとはあるイベントが発生した場合に自動的に実行されるプロシージャです。
下記のイベント発生時にトリガーを起動させることができます。

  • DML(DELETE, INSERT, UPDATE)
  • DDL(CREATE, ALTER, DROP)
  • データベース処理(SERVERERROR, LOGON, LOGOFF, STARTUP, SHUTDOWN)

トリガーの作成方法 

トリガーは、CREATE TRIGGER句を使用して作成します。
OR REPLACEオプションを指定すると同名のトリガーを上書きします。

トリガーの起動タイミングを指定します。
BEFOREはテーブル更新前、AFTERはテーブル更新後にトリガーを起動させます。

トリガーの起動イベントを指定します。

トリガーの起動対象テーブルを指定します。

トリガーの起動回数を指定します。
FOR ECACH ROWオプションを指定すると行トリガーになり、指定しないと文トリガーになります。
行トリガーはレコードの更新毎、文トリガーはテーブルの更新毎に起動します。
1回の処理で複数行が更新された場合には、行トリガーは行数分、文トリガーは1回のみトリガーが起動します。

トリガーの起動条件を指定します。
WHENオプションを指定すると一定の条件を満たした場合にのみトリガーを起動させることができます。

EMPテーブルのUPDATE後に起動する行トリガーを作成する場合

トリガー本体の作成

起動イベントでINSERT OR UPDATE OR DELETEとした場合に、トリガー内で処理を分岐するにはDMLの種類を評価します。

トリガー内で更新前後の値を参照するには、バインド変数(ホスト変数):old.列名、new.列名で参照することができます。
ただし、値が参照できるのは行トリガーのみで文トリガーは参照できません。
また、起動イベントによりold/newに格納される値が異なります。

起動イベントoldnew
INSERTNULL更新後値
UPDATE更新前値更新後値
DELETE更新前値NULL

DMLの種類を判定して更新前後の値を表示する。

トリガーからプロシージャを起動する。

トリガー使用時の注意点

  • トリガー内の処理でCOMMITやROLLBACKは禁止
    トリガーは上位のトランザクションよる起動されるので、トリガー内でCOMMITを行うと、上位のトランザクションでROLLBACKができなくなります。
  • 起動対象テーブルへのデータ更新
    例えば、UPDATEイベントで起動されるトリガ内でデータ更新をすると、メモリがなくなるまで再帰処理を続けます。

Google AdSense PC

Google AdSense PC

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  関連記事

oracle
Oracle 11g XEへのデータ移行方法を検討してみる

Oracleのデータ移行時は移行元と移行先の文字コードに注意する必要があります。 Windows環境のOracleでは「JA16SJIS」や「JA16SJIST …

sqlserer
[SQL Server]再帰SQLで集計する

WITH(共通テーブル式)を使って集計する WITH句とは 共通テーブル式 (CTE) は、単一の SELECT、INSERT、UPDATE、DELETE、CR …

oracle
[Oracle]トリガーの実行順序を設定する方法

FOLLOWS句を使用して実行順序を設定する 1つの表に対して同レベル(タイミング)のトリガーを複数作成することはできますが、実行順序は保証されていません。 実 …

oracle
[Oracle]データベースを再構築してOracle Expressのキャラクタセットを変更する

前回の記事でCSALTERを使用したキャラクタセットの変更方法を記載しましたが、サブセットのキャラクタセットからスーパセットへの変更のみ可能でした。 この記事で …

sqlserer
[SQL Server]データを期間別に集計する

SQL Serverで集計表を出力 日付をDATETIME型で管理している場合、CONVERT関数、DATEPART関数を使って、日、週、月、年別の集計結果を出 …

oracle
[Oracle]端数処理、丸めの方法

ORACLEで数値の端数処理、数値丸めをする 数値を四捨五入する場合は、ROUND関数数値を切り捨てる場合は、TRUNC関数各関数の第2引数の値で、小数部、また …

oracle
Oracle12cのPDBを自動起動にする方法

Oracle12cのプラガブル・データベース(PDB)は初期設定のままでは、毎回、手動で起動させる必要があります。 この記事ではOS起動時やOracle再起動時 …

sqlserer
[SQLServer]日付文字列 + 時刻文字列をDATETIME型に変換する方法

SQLServerで日付文字列 + 時刻文字列をDATETIME型に変換する方法 日付と時刻を別のカラムに格納している場合に日時データとして扱いたい場合はCON …

sqlserer
[SQL Server]IDENTITYの値を初期化する

ID値の初期化(リセット)方法 IDENTITYプロパティを設定した列のID値を初期化(リセット)する方法を記載します。 現在のID値を確認する ID値を確認す …

sqlserer
[SQL Server]クロス集計の方法

PIVOTを使ってクロス集計する SQL ServerでExcelのピボットテーブルのようなクロス集計をするには、PIVOT関係演算子を使って集計することができ …