Проблема с триггером в Oracle
Вопрос
Я новый в 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: «Новый». "IdPropuesta": Идентификатор не действителен
Решение
Из того, что вы описали:
Попробуйте перекомпилировать триггер и посмотреть, что происходит ...
Trigger становится недействительным, если базовый объект (Ex..table) становится недействительным или измененным, и триггер относится к пораженной таблице.
Другие советы
Не уверены, почему принятый ответ был принят как ни это, ни приложенные комментарии, похоже, не решают очевидную проблему в размещенном кодексе.
В телу триггера мы ссылаются на значения в вставленной строке с :NEW
кодовое слово. Объединенный код не хватает толстой кишки, когда она ссылается на столбец в пункте «Где». Это то, что нужно:
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'
/