Проблема с триггером в оракуле - PullRequest
1 голос
/ 07 августа 2010

Я новичок в 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": идентификатор недействителен

Ответы [ 2 ]

3 голосов
/ 07 августа 2010

Не уверен, почему принятый ответ был принят, поскольку ни он, ни прилагаемые комментарии, похоже, не решают очевидную проблему в размещенном коде.

В теле триггера мы ссылаемся на значения во вставленной строке с помощью кодового слова :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 не чувствительны к регистру. Таким образом, следующие два описания относятся к одному и тому же объекту:

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'
/
2 голосов
/ 07 августа 2010

Из того, что вы описали:

Попробуйте перекомпилировать триггер и посмотреть, что получится ...

Триггер становится недействительным, если базовый объект (ex..table) становится недействительным или изменяется, и триггер ссылается на уязвимую таблицу.

...