CREATE
TRIGGER
文は、次のいずれかのデータベース・トリガーを作成するか、または置き換えます。
表、スキーマまたはデータベースに関連付けられているストアドPL/SQLブロック
無名PL/SQLブロック、あるいはPL/SQLまたはJavaで実装されているプロシージャへのコール
指定された条件が発生した場合、トリガーは自動的に実行されます。
トリガー起動の順序 異なるタイミングBEFORE
、AFTER
、INSTEAD
OF
)を持つ2つ以上のトリガーが同じ表の同じ文に対して定義されている場合は、次の順序で起動されます。
すべてのBEFORE
文トリガー
すべてのBEFORE
行トリガー
すべてのAFTER
行トリガー
すべてのAFTER
文トリガー
場合によっては、異なるタイミングを持つ個々のトリガー群を、必要な順序でアクションを明示的にコード化した単一の複合トリガーに置き換えます。
同じタイミングを持つ2つ以上のトリガーが定義されており、起動順序が重要である場合は、FOLLOWS
句(「FOLLOWS」を参照)を使用して起動順序を制御できます。
表に複数の複合トリガーが指定されている場合、すべてのBEFORE
文セクションはBEFORE
文のタイミングで、BEFORE
行セクションはBEFORE
行のタイミングで、というように実行されます。 トリガーの実行順序がFOLLOWS
句で指定された場合、複合トリガーのセクションの実行順序はFOLLOWS
句によって決まります。 FOLLOWS
がすべてのトリガーではなく一部のトリガーのみに指定されている場合、トリガーの実行順序はFOLLOWS
句によって関係付けられたトリガーについてのみ保証されます。
前提条件
自身のスキーマ内の表または自身のスキーマ(SCHEMA
)に対するトリガーを自身のスキーマ内に作成する場合は、CREATE
TRIGGER
システム権限が必要です。
任意のスキーマ内の表または別のユーザーのスキーマ(schema
.SCHEMA
)に対するトリガーを任意のスキーマ内に作成する場合は、CREATE
ANY
TRIGGER
システム権限が必要です。
前述の権限に加えて、DATABASE
に対するトリガーを作成する場合は、ADMINISTER
DATABASE
TRIGGER
システム権限が必要です。
トリガーがSQL文を発行するか、あるいはプロシージャまたはファンクションをコールする場合、そのトリガーの所有者には、これらの操作を行うための権限が必要です。 これらの権限は、ロールを介して付与するのではなく、所有者に直接付与する必要があります。
構文
create_trigger ::=
(non_dml_trigger ::=、trigger_body ::=)
(dml_event_clause ::=、referencing_clause ::=)
(dml_event_clause ::=、referencing_clause ::=)
non_dml_trigger ::=
(plsql_block ::=、compound_trigger_block ::=、『Oracle Database SQL言語リファレンス』のCALL
routine_clauseに関する項)
dml_event_clause ::=
compound_trigger_block ::=
timing_point_section ::=
tps_body ::=
キーワードとパラメータの説明
OR
REPLACE
を指定すると、トリガーがすでに存在する場合に再作成できます。 この句を指定すると、既存のトリガーの定義を削除せずに変更できます。
schema
トリガーを含めるスキーマを指定します。 schema
を省略すると、データベースによってユーザー自身のスキーマにトリガーが作成されます。
trigger
作成するトリガーの名前を指定します。
トリガーでコンパイル・エラーが発生した場合、そのトリガーは作成されますが実行時に正常に処理されません。 この場合、コンパイル・エラーが発生したトリガーが無効にされるか、コンパイル・エラーのないバージョンに置き換えられるか、または削除されるまで、トリガーを起動するすべてのDML文は実行できません。 関連付けられているコンパイラ・エラー・メッセージは、SQL*PlusコマンドSHOW
ERRORS
を使用して確認できます。
注意: マテリアライズド・ビューの実表にトリガーを作成する場合は、トリガーがマテリアライズド・ビューのリフレッシュ中に起動されないようにする必要があります。 リフレッシュ中、DBMS_MVIEW プロシージャI_AM_A_REFRESH はTRUE を戻します。 |
simple_dml_trigger
この句を使用すると、DMLイベントに1つのトリガーを定義できます。
BEFORE
を指定すると、データベースでトリガーを起動するイベントを実行する前にトリガーを起動できます。 行トリガーの場合、影響を受ける各行が変更される前にトリガーが起動されます。
BEFOREトリガーの制限 BEFORE
トリガーには、次の制限があります。
BEFORE
トリガーは、ビューには指定できません。
BEFORE
文トリガー、または複合トリガーのBEFORE
文セクションでは、:NEW
または:OLD
は指定できません。 BEFORE
行トリガー、または複合トリガーのBEFORE
行セクションでは、:OLD
または:NEW
フィールドの読取りおよび書込みが可能です。
AFTER
を指定すると、データベースでトリガーを起動するイベントを実行した後にトリガーを起動できます。 行トリガーの場合、影響を受ける各行が変更された後にトリガーが起動されます。
AFTERトリガーの制限 AFTER
トリガーには、次の制限があります。
AFTER
トリガーは、ビューには指定できません。
AFTER
文トリガー、または複合トリガーのAFTER
文セクションでは、:NEW
または:OLD
は指定できません。 AFTER
行トリガー、または複合トリガーのAFTER
行セクションでは、:OLD
または:NEW
フィールドの読取りは可能ですが、書込みはできません。
注意: 表に対するマテリアライズド・ビュー・ログを作成した場合は、その表にAFTER ROW トリガーが暗黙的に作成されます。 このトリガーは、INSERT 文、UPDATE 文またはDELETE 文でマスター表のデータが変更された場合、常にマテリアライズド・ビュー・ログに1行を挿入します。 複数の行トリガーを起動する順序は制御できません。 したがって、マテリアライズド・ビューの内容に影響するトリガーは記述しないでください。 |
参照: マテリアライズド・ビュー・ログの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
INSTEAD
OF
を指定すると、データベースでトリガーを起動するイベントを実行するかわりに、トリガーを起動することができます。 複合トリガーでINSTEAD
OF
ROW
セクションを指定したときと同じ効果が得られます。
注意: データベースのファイングレイン・アクセス制御を使用すると、ビューに行レベルのセキュリティ・ポリシーを定義できます。 これらのポリシーによって、DML操作に応じて定義されたルールが適用されます。 ビューにINSTEAD OF トリガーも定義すると、データベースによって行レベルのセキュリティ・ポリシーは適用されません。ビューに対してDMLが実行されるかわりに、INSTEAD OF トリガーが起動されるためです。 |
INSTEAD
OF
トリガーは、任意のビューに対するDMLイベントに有効です。 DDLまたはデータベース・イベントには有効ではありません。INSTEAD
OF
トリガーは、表には指定できません。
:OLD
値と:NEW
値のいずれも読取りはできますが、:OLD
と:NEW
値のいずれも書込みはできません。
ビューが本質的に更新可能であり、そのビューにINSTEAD
OF
トリガーがある場合は、トリガーが優先されます。 ビューでDMLを実行するかわりに、トリガーが起動されます。
ビューが階層に属する場合、サブビューはトリガーを継承しません。
DML_event_clause
を使用すると、トリガーを起動する3つのDML文のいずれかを指定できます。データベースによって、既存のユーザー・トランザクションでトリガーが起動されます。
DML_event_clause
には、MERGE
キーワードを指定できません。 MERGE
操作に関連してトリガーを起動する必要がある場合は、MERGE
操作の構成要素であるINSERT
およびUPDATE
操作に対してトリガーを作成する必要があります。
DELETE DELETE
を指定すると、DELETE
文で表から行を削除するか、またはネストした表から要素を削除するたびにデータベースでトリガーを起動できます。
INSERT INSERT
を指定すると、INSERT
文で表に行を挿入するか、またはネストした表に要素を挿入するたびにデータベースでトリガーを起動できます。
UPDATE UPDATE
を指定すると、OF
句の後に指定したいずれかの列の値をUPDATE
文で変更するたびにデータベースでトリガーを起動できます。 OF
句を省略すると、UPDATE
文で表またはネストした表のいずれかの列の値を変更するたびにデータベースによってトリガーが起動されます。
UPDATE
トリガーでは、オブジェクト型、VARRAY型およびREF
型の列をOF
句の後に指定して、UPDATE
文によってこれらのいずれかの列の値が変更されるたびにトリガーが起動されるようにすることができます。 ただし、これらの列の値はトリガー本体では変更できません。
注意: Oracle Call Interface(OCI)関数またはDBMS_LOB パッケージを使用してオブジェクト列のLOB値またはLOB属性を更新した場合、データベースによってその列または属性を含む表に定義されているトリガーは起動されません。 |
UPDATE操作でのトリガーの制限 UPDATE
句には、次の制限があります。
UPDATE
OF
は、INSTEAD
OF
トリガーには指定できません。UPDATE
でビューの任意の列の値を変更するたびに、データベースによってINSTEAD
OF
トリガーが起動されます。
UPDATE
OF
句には、ネストした表またはLOB列は指定できません。
参照: ビューに対する挿入、更新または削除を禁止する構造体の詳細は、『Oracle Database SQL言語リファレンス』の「CREATE VIEW 」のAS subquery 句に関する項を参照してください。 |
ネストした表の列にDML操作を直接実行した場合、そのネストした表の列が含まれている表に定義されているトリガーはデータベースによって起動されません。
ON table | view ON
句を使用すると、トリガーが作成されるデータベース・オブジェクトを決定できます。 トリガーを作成する、次のいずれかのschema
およびtable
またはview
の名前を指定します。
表またはビュー
オブジェクト表またはオブジェクト・ビュー
ネストした表型の列
schema
を省略すると、表は自身のスキーマ内に存在するとみなされます。
スキーマの制限 トリガーは、SYS
スキーマ内の表には作成できません。
NESTED TABLE句 トリガーが定義されるビューのnested_table_column
を指定します。 このようなトリガーは、DMLの操作対象がネストした表の要素である場合にのみ起動されます。
ネストした表のトリガーの制限 NESTED
TABLE
は、INSTEAD
OF
トリガーにのみ指定できます。
referencing_clause
を使用すると、相関名を指定できます。 相関名は、特に現在の行の新旧の値を参照する場合に、トリガー本体および行トリガーのWHEN
条件で使用できます。 デフォルトの相関名はOLD
およびNEW
です。 行トリガーをOLD
またはNEW
という表に関連付ける場合は、表名と相関名との混乱を回避するために、この句を使用して異なる相関名を指定します。
ネストした表にトリガーが定義されている場合、OLD
およびNEW
はネストした表の行を参照し、PARENT
は親表の現在の行を参照します。
オブジェクト表またはビューにトリガーが定義されている場合、OLD
およびNEW
はオブジェクト・インスタンスを参照します。
referencing_clauseの制限 referencing_clause
は、DDLイベントCREATE
のINSTEAD
OF
トリガーでは無効です。
FOR
EACH
ROW
を指定すると、トリガーを行トリガーとして設定できます。行トリガーは、トリガーを起動する文の影響を受け、かつWHEN
条件で定義したオプションのトリガー制約を満たす行ごとに1回起動されます。
この句を省略すると、INSTEAD
OF
トリガー以外のトリガーは文トリガーになります。オプションのトリガー制約が満たされている場合にトリガーを起動する文を発行すると、データベースによって文トリガーが1回のみ起動されます。
INSTEAD
OF
トリガー文は、各行に対して暗黙的にアクティブになります。
行トリガーの制限 この句は、複合DMLトリガー、DDLトリガーまたはデータベース・イベント・トリガーではなく、単純なDMLトリガーにのみ有効です。
compound_dml_trigger
この句を使用すると、DMLイベントに複合トリガーを定義できます。 COMPOUND
トリガーの本体には、最大4つのセクションを指定できます。したがって、文の前、行の前、行の後または文の後の操作を1つのトリガー内に指定できます。
dml_event_clauseおよびreferencing_clauseは、複合DMLトリガーに対して単純なDMLトリガーと同じセマンティクスを持ちます。
複合トリガーの制限 FOR
EACH
ROW
句は、複合トリガーには指定できません。
non_dml_trigger
この句を使用すると、DDLイベントまたはデータベース・イベントに1つのトリガーを定義できます。
トリガーを起動できる1つ以上の種類のDDL文を指定します。 特に指定がないかぎり、DATABASE
またはSCHEMA
に対してこれらのイベントのトリガーを作成できます。 これらのイベントにはBEFORE
トリガーおよびAFTER
トリガーを作成できます。データベースによって既存のユーザー・トランザクションでトリガーが起動されます。
DDLイベントのトリガーの制限 PL/SQLプロシージャを介して実行されたDDL操作は、トリガーを起動するイベントとしては指定できません。
次のddl_event
値が有効です。
ALTER ALTER
を指定すると、ALTER
文でデータ・ディクショナリのデータベース・オブジェクトを変更するたびにトリガーを起動できます。 トリガーは、ALTER
DATABASE
文では起動されません。
ANALYZE ANALYZE
を指定すると、統計情報が収集または削除されるか、またはデータベース・オブジェクトの構造が検証されるたびにトリガーを起動できます。
参照: SQL文のANALYZE を使用して統計情報を収集する方法の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
ASSOCIATE STATISTICS ASSOCIATE
STATISTICS
を指定すると、データベースによって統計タイプがデータベース・オブジェクトに関連付けられるたびにトリガーを起動できます。
AUDIT AUDIT
を指定すると、SQL文の実行またはスキーマ・オブジェクトに対する操作が追跡されるたびにトリガーを起動できます。
COMMENT COMMENT
を指定すると、データベース・オブジェクトに対するコメントがデータ・ディクショナリに追加されるたびにトリガーを起動できます。
CREATE CREATE
を指定すると、CREATE
文でデータ・ディクショナリに新しいデータベース・オブジェクトを追加するたびにトリガーを起動できます。 トリガーは、CREATE
DATABASE
文またはCREATE
CONTROLFILE
文では起動されません。
DISASSOCIATE STATISTICS DISASSOCIATE
STATISTICS
を指定すると、データベースによって統計タイプがデータベース・オブジェクトとの関連付けを解除されるたびにトリガーを起動できます。
DROP DROP
を指定すると、DROP
文でデータ・ディクショナリのデータベース・オブジェクトを削除するたびにトリガーを起動できます。
GRANT GRANT
を指定すると、ユーザーが別のユーザーまたはロールにシステム権限、ロールまたはオブジェクト権限を付与するたびにトリガーを起動できます。
NOAUDIT NOAUDIT
を指定すると、NOAUDIT
文でスキーマ・オブジェクトでのSQL文または操作の追跡を停止するたびにトリガーを起動できます。
RENAME RENAME
を指定すると、RENAME
文でデータベース・オブジェクトの名前を変更するたびにトリガーを起動できます。
REVOKE REVOKE
を指定すると、REVOKE
文でユーザーまたはロールからシステム権限、ロールまたはオブジェクト権限を取り消すたびにトリガーを起動できます。
TRUNCATE TRUNCATE
を指定すると、TRUNCATE
文で表またはクラスタから行を削除し、記憶特性を再設定するたびにトリガーを起動できます。
DDL DDL
を指定すると、前述のDDL文のいずれかを発行するたびにトリガーを起動できます。
トリガーを起動できる1つ以上のデータベースの状態を指定します。 特に指定がないかぎり、DATABASE
またはSCHEMA
に対してこれらのイベントのトリガーを作成できます。 これらのトリガーを起動する各イベントに対して、データベースによって自律型トランザクションの有効範囲がオープンされ、トリガーが起動されて、(既存のユーザー・トランザクションには関係なく)別のトランザクションがコミットされます。
各データベース・イベントは、BEFORE
トリガーまたはAFTER
トリガーのいずれかで有効です。ただし、両方で有効ではありません。 次のdatabase_event
値が有効です。
AFTER STARTUP AFTER
STARTUP
を指定すると、データベースがオープンされるたびにトリガーを起動できます。 このイベントは、DATABASE
でのみ有効であり、SCHEMA
では有効ではありません。
BEFORE SHUTDOWN BEFORE
SHUTDOWN
を指定すると、データベースのインスタンスが停止されるたびにトリガーを起動できます。 このイベントは、DATABASE
でのみ有効であり、SCHEMA
では有効ではありません。
AFTER DB_ROLE_CHANGE Data Guardの構成では、AFTER
DB_ROLE_CHANGE
を指定すると、ロールがスタンバイからプライマリ、またはプライマリからスタンバイに変更されるたびにトリガーを起動できます。 このイベントは、DATABASE
でのみ有効であり、SCHEMA
では有効ではありません。
AFTER LOGON AFTER
LOGON
を指定すると、クライアント・アプリケーションがデータベースにログオンするたびにトリガーを起動できます。
BEFORE LOGOFF BEFORE
LOGOFF
を指定すると、クライアント・アプリケーションがデータベースからログオフするたびにトリガーを起動できます。
AFTER SERVERERROR AFTER
SERVERERROR
を指定すると、サーバー・エラー・メッセージのログが記録されるたびにトリガーを起動できます。
次のエラーが発生しても、SERVERERROR
トリガーは起動されません(stringには文字列が入ります)。
ORA-01403: データが見つかりません。
ORA-01422: 完全フェッチがリクエストよりも多くの行を戻しました
ORA-01423: 完全フェッチで余分な行をチェック中にエラーが発生しました
ORA-01034: Oracleは使用できません。
ORA-04030: stringバイト(string,string)を割り当てようとしてプロセス・メモリーが不足しました。
AFTER SUSPEND SUSPEND
を指定すると、サーバー・エラーによってトランザクションが停止するたびにトリガーを起動できます。
DATABASE DATABASE
を指定すると、データベース全体にトリガーを定義できます。 データベース・ユーザーがトリガー・イベントを開始するたびにトリガーが起動されます。
SCHEMA SCHEMA
を指定すると、現行のスキーマにトリガーを定義できます。 schema
として接続しているユーザーがトリガー・イベントを開始するたびにトリガーが起動されます。
この句を使用すると、同じタイプの複数のトリガーに相対的な起動順序を指定できます。 FOLLOWS
を使用すると、作成されるトリガーが、指定したトリガーの後に起動するように指定できます。
指定したトリガーは、すでに存在している必要があります。また、作成されるトリガーと同じ表に定義されており、正常にコンパイルされている必要があります。 有効になっている必要はありません。
FOLLOWS
は、複合トリガー・ターゲットを持つ単純なトリガーの定義、または単純なトリガー・ターゲットを持つ複合トリガーの定義に指定できます。 このような場合、FOLLOWS
キーワードは、単純なトリガーと同じタイミングを持つ複合トリガーのセクションにのみ適用されます。 複合トリガーにそのようなタイミングがない場合、FOLLOWS
は特に警告もなく無視されます。
この句を使用すると、有効または無効な状態でトリガーを作成できます。 無効な状態でトリガーを作成すると、実際に使用する前にトリガーがエラーなしでコンパイルされることを確認できます。
DISABLE
を指定すると、トリガーを無効な形式で作成できます。 その後、ALTER
TRIGGER
... ENABLE
またはALTER
TABLE
... ENABLE
ALL
TRIGGERS
文を発行して、トリガーを有効にできます。 この句を省略すると、トリガーは作成時に有効になります。
参照:
|
トリガー条件(データベースでトリガーを起動するために必要なSQL条件)を指定します。 この条件には相関名を指定する必要があります。問合せは指定できません。
NEW
およびOLD
キーワードをWHEN
句で指定する場合は、バインド変数とみなされないため、コロン(:)を前に付けません。 ただし、WHEN
句以外のすべての参照では、NEW
およびOLD
の前にコロンを付けて指定する必要があります。
トリガー条件の制限 トリガー条件には、次の制限があります。
DMLイベント・トリガーに対してこの句を指定する場合は、FOR
EACH
ROW
も指定する必要があります。トリガーを起動する文の影響を受ける行ごとに、この条件が評価されます。
トリガー条件は、INSTEAD
OF
トリガー文には指定できません。
オブジェクト列、オブジェクト列の属性、VARRAY、ネストした表またはLOB列を参照できます。 トリガー条件内ではPL/SQLファンクションおよびメソッドは起動できません。
トリガーを起動するためにデータベースによって実行されるPL/SQLブロック、PL/SQL複合トリガー・ブロックまたはコール・プロシージャを指定します。
compound_trigger_block
タイミング部は任意の順序で指定できますが、繰り返して使用することはできません。 複合トリガー・ブロックのdeclare_section
にPRAGMA
AUTONOMOUS_TRANSACTION
を含めることはできません。
DMLトリガーの作成: 例 次の例では、BEFORE
文トリガーの基本構文を示します。 このようなトリガーは、表に対してDML文を発行できる場合などに、DML文に制限を課すために記述します。
CREATE TRIGGER schema.trigger_name BEFORE DELETE OR INSERT OR UPDATE ON schema.table_name pl/sql_block
DML文が表に対して実行されるたびにトリガーが起動されます。 このトリガーは、BEFORE
文トリガーであるため、トリガーを起動する文が実行される前にデータベースによって1回起動されます。
次の例では、パーシャルBEFORE
行トリガーを示します。 たとえば、PL/SQLブロックによって、従業員の給与が従業員の職種に対して設定された給与の範囲内にあるように指定されたとします。
CREATE TRIGGER hr.salary_check
BEFORE INSERT OR UPDATE OF salary, job_id ON hr.employees
FOR EACH ROW
WHEN (new.job_id <> 'AD_VP')
pl/sql_block
このトリガーは、次の文のいずれかが発行されるたびに起動されます。
employees
表に対して行を追加するINSERT
文
employees
表のsalary
列の値またはjob_id
列の値を変更するUPDATE
文
salary_check
は、BEFORE
行トリガーであるため、UPDATE
文で更新される各行を変更する前、またはINSERT
文で挿入される各行を追加する前に起動されます。
salary_check
には、管理部門の副社長(AD_VP
)の給与を確認できないトリガー条件が設定されています。
DDLトリガーの作成: 例 次の例では、任意のDDL文CREATE
のAFTER
文トリガーを作成します。 このようなトリガーを使用して、自身のスキーマにある新規データ・ディクショナリ・オブジェクトの作成を監査します。
CREATE TRIGGER audit_db_object AFTER CREATE
ON SCHEMA
pl/sql_block
トリガー本体のプロシージャのコール: 例 PL/SQLブロック内にトリガー本体を設定するかわりに、プロシージャをコールすることによって、前述の例で記述されたsalary_check
トリガーを作成できます。 従業員の給与が適切な範囲内にあることを確認するcheck_sal
プロシージャをhr
スキーマに定義したとします。 トリガーsalary_check
は、次のようにして作成できます。
CREATE TRIGGER salary_check BEFORE INSERT OR UPDATE OF salary, job_id ON employees FOR EACH ROW WHEN (new.job_id <> 'AD_VP') CALL check_sal(:new.job_id, :new.salary, :new.last_name)
check_sal
プロシージャは、PL/SQL、CまたはJavaで実装できます。 また、:NEW
値のかわりにCALL
句の:OLD
値を指定できます。
データベース・イベント・トリガーの作成: 例 次の例では、すべてのエラーのログを記録するトリガーの基本構文を示します。 仮定のPL/SQLブロックが特定のエラー(無効なログオン: エラー番号は1017)に対して特別な処理を行うとします。 このトリガーは、AFTER
文トリガーであるため、文の実行の失敗(ログオンの失敗など)の後で起動されます。
CREATE TRIGGER log_errors AFTER SERVERERROR ON DATABASE BEGIN IF (IS_SERVERERROR (1017)) THEN <special processing of logon error> ELSE <log error number> END IF; END;
INSTEAD OFトリガーの作成: 例 次の例では、顧客情報および注文情報を表示するoe.order_info
ビューを作成します。
CREATE VIEW order_info AS SELECT c.customer_id, c.cust_last_name, c.cust_first_name, o.order_id, o.order_date, o.order_status FROM customers c, orders o WHERE c.customer_id = o.customer_id;
通常、orders
表の主キー(order_id
)は結合ビューの結果セットで一意でないため、このビューは更新できません。 このビューを更新できるようにするには、ビューにINSTEAD
OF
トリガーを作成し、ビューに送られるINSERT
文を処理します。
CREATE OR REPLACE TRIGGER order_info_insert
INSTEAD OF INSERT ON order_info
DECLARE
duplicate_info EXCEPTION;
PRAGMA EXCEPTION_INIT (duplicate_info, -00001);
BEGIN
INSERT INTO customers
(customer_id, cust_last_name, cust_first_name)
VALUES (
:new.customer_id,
:new.cust_last_name,
:new.cust_first_name);
INSERT INTO orders (order_id, order_date, customer_id)
VALUES (
:new.order_id,
:new.order_date,
:new.customer_id);
EXCEPTION
WHEN duplicate_info THEN
RAISE_APPLICATION_ERROR (
num=> -20107,
msg=> 'Duplicate customer or order ID');
END order_info_insert;
/
すべてのNOT
NULL
列に値があるかぎり、ビューを介していずれの実表にも挿入できるようになります。
INSERT INTO order_info VALUES (999, 'Smith', 'John', 2500, '13-MAR-2001', 0);
INSTEAD
OF
トリガーの詳細は、「複合ビューの変更(INSTEAD OFトリガー)」を参照してください。
SCHEMAトリガーの作成: 例 次の例では、サンプル・スキーマhr
にBEFORE
文トリガーを作成します。 hr
として接続しているユーザーがデータベース・オブジェクトを削除しようとすると、オブジェクトの削除前に、データベースによってこのトリガーが起動されます。
CREATE OR REPLACE TRIGGER drop_trigger BEFORE DROP ON hr.SCHEMA BEGIN RAISE_APPLICATION_ERROR ( num => -20000, msg => 'Cannot drop object'); END; /
関連トピック