[解決済み] ORA-04082: テーブルレベルのトリガーで NEW または OLD 参照は許可されません。
質問
という名前のテーブルがあります。 について . その中で につき テーブルには、"fl1" というフィールドと "fl2" という別のフィールドがあります。 レコードを更新するときに、"fl1"の値が変更されたかどうかをチェックしたいのです"。値が変更された場合、"fl2"列を"fl1"から新しい値で更新します。
こんなトリガーを思いつきました。
CREATE OR REPLACE TRIGGER Flag
AFTER INSERT OR UPDATE on per
REFERENCING NEW AS NEW OLD AS OLD
BEGIN
If :New.fl1 != :Old.fl1 Then
:New.fl2:= :new.fl1;
End If;
END;
ORA-04082 が表示されます。を実行すると、「NEW または OLD 参照はテーブル レベル トリガで許可されていません。
私が考えていた他のオプションは(効率的かどうかはわかりませんが)、"fl1" の値が変更されたかどうかに関係なく、単純に "fl2" の値を "fl1" の値で更新することでした。
アップデイト
For Each Row" を追加し、 "AFTER INSERT OR UPDATE" を "BEFORE INSERT OR UPDATE" に変えました。動作しています。
CREATE OR REPLACE TRIGGER Flag
BEFORE INSERT OR UPDATE on per
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
If :New.fl1 != :Old.fl1 Then
:New.fl2:= :new.fl1;
End If;
END;
解決方法は?
DMLトリガーは、テーブルレベルまたは行レベルで定義されます。
テーブルレベル トリガは、テーブル上の各操作に対して一度だけ起動します。従って、30行を更新すると、テーブルトリガに関する限り、それは1つの操作です。テーブルトリガは、どの行が変更されたかを知ることはできませんが、操作が実行されたことを記録するために使用することができます。
この場合、行レベル トリガが必要で、トリガ定義に "FOR EACH ROW" が含まれることが必要です。新旧の行を参照する方法を変更したくない場合、"REFERENCING"節はオプションです。
http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/triggers.htm#BABCIBBJ
ここでの演習の意味がよくわからないけど。fl2の代わりにfl1を参照することは考えなかったのでしょうか?
関連
-
オラクルインデックス概要
-
sqlplusコマンドによるOracleデータベースへのさまざまなログイン方法
-
SQLPlusコマンドの使い方の説明
-
Oracle PL/SQLを使用して電子メール機能(UTL_MAIL)を実装する方法
-
[解決済み] PL/SQLで、文字列中のシングルクォートをエスケープする方法は?
-
[解決済み] ORA-00917: カンマ欠落エラー [終了しました]。
-
[解決済み] ORA-12545: ターゲットホストまたはオブジェクトが Mac に存在しないため、接続に失敗しました - SQLPLUS
-
[解決済み] PL/SQLプロシージャ - SQLステートメント無視エラー
-
[解決済み] ある列の最大値を持つ行を取得する
-
[解決済み] 挿入更新トリガー 挿入か更新かを判断する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Oracleの表領域と権限を徹底解説
-
オラクルのファジー・クエリーとその使い方
-
ODBC sqlserverデータソースに接続するためのOracleの詳細な手順
-
Oracleトレースファイルの詳細な使用方法
-
[解決済み] エラー ORA-01804 のテキストを取得しようとしているときにエラーが発生しました。
-
[解決済み] ORA-01882: タイムゾーン領域が見つかりません。
-
[解決済み] Oracleのテーブル名の最大長は?
-
[解決済み] ORA-01950: テーブルスペース 'USERS' に特権がありません [閉鎖]。
-
[解決済み] ORA-30036: アンドゥ テーブルスペース 'UNDOTBS' でセグメントを 8 つ拡張できません。
-
[解決済み] ORA-00980 PLSQL で同義語の翻訳が有効でなくなった。