используя: новые и: старые ссылки на разные таблицы в SQL - PullRequest
0 голосов
/ 24 января 2019

Подготовка к сдаче экзамена.Вопрос гласит:

Напишите команду SQL для создания триггера в таблице Permission.Триггер должен добавить один к числу numberOfPermissions в таблице File для файла, после того как каждый раз в таблицу Permission вводится новая строка полномочий с именем этого файла.

вот список предоставленных таблиц

У меня есть все, кроме одной строки, строки ГДЕ.Как мне указать значение: new для другой таблицы?Ему нужно прочитать новое значение в виде столбца fileName из таблицы Permissions, но я не уверен, как это сделать.Я пробовал это такими способами, как: Permissions.new.fileName и т. Д., Но я всегда получаю неопределенную ошибку вокруг "."балл.

    CREATE TRIGGER newTrig
AFTER INSERT ON Permission
BEGIN
UPDATE File
SET numberOfPermissions = numberOfPermissions+1
WHERE File.name = :new.fileName
END;

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Когда я запускаю ваш код создания триггера в этой скрипте БД , он дает мне:

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

=> Обычно не рекомендуется создавать таблицы, имена которых являются зарезервированными словами, иногда это может привести к хитрым ошибкам.

0 голосов
/ 24 января 2019

Триггер знает, какие записи должны обновляться, поэтому вы можете использовать указатель ": OLD". Попробуйте что-то вроде этого:

    CREATE OR REPLACE TRIGGER newTrig
    AFTER INSERT ON Permission
    FOR EACH ROW
    BEGIN
        UPDATE File
        SET numberOfPermissions = numberOfPermissions+1 
        WHERE name = :old.fileName
    END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...