オラクルでトリガー通報
質問
私は、Oracleの新しいだと私はこのトリガと間違っているかわからない。
CREATE OR REPLACE TRIGGER "propuesta_casas"
BEFORE INSERT ON "PROPUESTA_TIENDA_BARRIO"
FOR EACH ROW
WHEN (new."CASASCAL" IS NULL)
BEGIN
SELECT PROPUESTA.CASAS
INTO :new."CASASCAL"
FROM PROPUESTA WHERE PROPUESTA.IDPROPUESTA=new.IDPROPUESTA ;
END;
/
エラー:
PL / SQL:ORA-00904: "NEW" "IDPROPUESTA":identifider有効ではありません。
解決
トリガーを再コンパイルしてみてください...
何が起こるか見てベースオブジェクト(ex..table)が無効であるか、または変更されたとなり、トリガが影響を受けたテーブルを参照する場合、トリガは無効となります。
他のヒント
必ずなぜ受け入れられた答えは、それも添付のコメントでもないとして受け入れられていないが投稿されたコードの明らかな問題に対処するように見える。
はトリガー本体では、:NEW
コードワードと挿入された行の値を参照します。それはWHERE句で列を参照するときに通知コードは、コロンを欠いています。これは、必要とされるものです。
CREATE OR REPLACE TRIGGER "propuesta_casas"
BEFORE INSERT ON "PROPUESTA_TIENDA_BARRIO"
FOR EACH ROW
WHEN (new."CASASCAL" IS NULL)
BEGIN
SELECT PROPUESTA.CASAS
INTO :new."CASASCAL"
FROM PROPUESTA
WHERE PROPUESTA.IDPROPUESTA=:new.IDPROPUESTA ;
END;
/
<時間>
ところで、オブジェクトを作成するときに二重引用符で下部ケースを使用するために気を付けます。
デフォルトでは、すべてのOracle名は大文字でデータ・ディクショナリに格納されますが、SQL文は、ケースの小文字は区別されません。以下のように、2つたstatmentsは、同じオブジェクトを参照します:
select * from emp
/
select * from EMP
/
私たちは大文字と小文字または小文字の名前で私たちのオブジェクトを作成して、二重引用符でそれを置く場合は、しかし、それは、の正確なケースのようにデータ・ディクショナリに格納されています。この手段は、私たちは二重引用符で、オブジェクトを参照するたびにその正確なケースを使用する必要があります。だから我々はすべて小文字でテーブルを作成した場合...
create table "emp" ...
...この文は失敗します。
select * from emp
/
これは
である必要がありますselect * from "emp"
/
我々はすでにEMPというテーブルを持っている場合だけ別のテーブルから選択していた場合は、もちろん、その後、最初の文は、成功しただろう。
トリガーのケースでは、一般的に名前によってそれらを参照していません。しかし、我々は、我々はデータ・ディクショナリにトリガを検索するたびにケースを使用する必要があります:
select status
from user_triggers
where trigger_name = 'propuesta_casas'
/