Вы можете запросить представление user_errors
, чтобы увидеть, что на самом деле не так; некоторые клиенты позволяют использовать show errors
в качестве ярлыка после создания объекта (SQL Developer, SQLcl, SQL* Plus ..) и просмотра сообщения «Предупреждение: триггер создан с ошибками компиляции». С вашим текущим кодом, который будет выглядеть примерно так:
PLS-00103: обнаружен символ "(" при ожидании одного из следующих значений:
; authid по умолчанию как принудительное при доступе
type
- это зарезервированное слово , поэтому вы не можете использовать его для имени локальной переменной - он ожидает, что вы объявляете тип записи. Изменение имени переменная показывает следующую ошибку:
PLS-00103: Обнаружен символ «ДЕЙСТВИЕ» при ожидании одного из следующих значений:
: =; не нулевой символ по умолчанию
, потому что у вас нет точек с запятой после ваших объявлений.
Исправление, которое по-прежнему получает 'ORA-00904: «TRANSACTION_TYPE». «ID»: недопустимый идентификатор », потому что в вашем операторе обновления нет включить таблицу transaction_type
. Вы можете использовать корреляционные имена для ссылки на данные в исходной инструкции строки таблицы, для которой сработал триггер, используя :new
по умолчанию; теперь это компилируется:
CREATE OR REPLACE TRIGGER transaction_type_af_insert
AFTER INSERT ON transaction_type
FOR EACH ROW
DECLARE
l_type varchar2(30);
l_action varchar2(30);
BEGIN
UPDATE transaction_type_log_history
SET action = 'After_Insert_transaction_type'
WHERE transaction_type_log_history.id = :new.id;
END;
/
db <> fiddle
Фактически вы не используете ни одну из двух локально объявленных переменных, поэтому вы можете удалить их и ключевое слово declare
.
Кажется, вы также пытаться обновить таблицу истории вместо того, чтобы вставлять туда новую строку, что, по-видимому, предлагает вам сделать это в формулировке задачи.