Когда я запускаю ваш код создания триггера в этой скрипте БД , он дает мне:
ORA-04082: NEW or OLD references not allowed in table level triggers
В результате вы пропустили опцию FOR EACH ROW
в объявлении триггера. Поэтому Oracle считает, что вам нужен триггер уровня table , который выполняется один раз для оператора (тогда как триггер уровня row выполняется один раз для каждой строки вставлена).
Поскольку один оператор может привести к вставке нескольких строк (например: INSERT INTO ... AS SELECT ...
), Oracle не позволяет вам обращаться к :NEW
и :OLD
ссылкам в триггерах уровня таблицы.
Добавление опции FOR EACH ROW
к определению триггера сделает его триггером уровня строки, которому разрешен доступ к ссылкам :NEW
и :OLD
.
CREATE TRIGGER newTrig
AFTER INSERT ON Permission
FOR EACH ROW
BEGIN
UPDATE File
SET numberOfPermissions = numberOfPermissions+1
WHERE File.name = :new.fileName;
END;
PS: вы также пропустили точку с запятой в конце оператора UPDATE
.
Несвязанный PS:
> create table USER ( x number);
ORA-00903: invalid table name
> create table FILE ( x number);
ORA-00903: invalid table name
=> Обычно не рекомендуется создавать таблицы, имена которых являются зарезервированными словами, иногда это может привести к хитрым ошибкам.