Вопрос

Я новый в 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'
/
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top