トリガー内の変更テーブルでDMLステートメントを使用できないことはわかっています(または少なくとも知っていました)。Oracleのドキュメントからの抜粋:
変更テーブルは、UPDATE、DELETE、またはINSERTステートメントによって変更されるテーブル、またはDELETE CASCADE制約の影響によって更新される可能性があるテーブルです。
トリガーステートメントを発行したセッションは、変更テーブルをクエリまたは変更できません。この制限により、トリガーが一貫性のないデータセットを参照するのを防ぎます。
ただし、insert into emp
SQL DeveloperまたはSQL * Plusを使用してこのデモトリガーが「変更テーブル」エラーで失敗しない理由を理解できません。
CREATE OR REPLACE TRIGGER emp_bri
BEFORE INSERT ON emp
FOR EACH ROW
BEGIN
SELECT max(id) + 1 INTO :NEW.id FROM emp;
UPDATE emp SET salary = 5000;
END emp_bri;
挿入は次のid
値で正常に完了し、すべてのemp
レコードを更新します。Oracle Database 11g Enterprise Editionリリース11.2.0.1.0を使用しています。複合トリガーについて読みましたが、サンプルでは使用していません。
はい、私はそれを知っています:)この例ではおそらく例はあまり良くありません...自動インクリメント値はシーケンスとトリガーを使用して確実に実装する必要があります。
—
センチュリオン
これは確かに奇妙です。ところで:これはSQLFiddleの例ですsqlfiddle.com/#!4/9e59f/2
—
a_horse_with_no_name
情報を共有してくれてありがとう、クールなリンク。そのようなOracle SQLテストWebサイトがあることを知りませんでした:)
—
Centurion
a_horse_with_no_name:別の例を:フィドルテスト-2(SET給与=給与+ 10)
—
ypercubeᵀᴹ
select max(id)
ユニークな番号を割り当てます。しないでください。それは単に不正確であり、同様にスケーリングしません。