Триггер Oracle со ВСТАВКОЙ В таблицу

#sql #oracle #triggers

Вопрос:

Я пытаюсь создать триггер Oracle с помощью инструкции After Update. Похоже, что я не могу создать триггер, потому что мне предлагается ошибка «Таблица не существует».:

 CREATE OR REPLACE TRIGGER USR1.CORE_FINISHED
AFTER UPDATE OF RUNTIME_STATUS
ON USR2.runtime_btc
FOR EACH ROW
WHEN ( new.RUNTIME_STATUS = 'FINISHED'
AND new.id = 'cr_daily')

BEGIN
INSERT INTO USR1.test_dq_log (BTC_NO, TBL_NAM, SCR_NAM)
SELECT BTC_NO, TBL_NAM, SCR_NAM
FROM USR2.EVENT_LG -- This is where the script is throwing errors
WHERE BTC_NO = :NEW.BTC_NO;
END;
 

Что странно, так это то, что одно и то же выражение при запуске вне триггера:

 INSERT INTO USR1.test_dq_log (BTC_NO, TBL_NAM, SCR_NAM)
    SELECT BTC_NO, TBL_NAM, SCR_NAM
    FROM USR2.EVENT_LG 
    WHERE BTC_NO = 'any number here'
 

Кажется, все работает гладко, и он вставляет строки в таблицу!

Ответ №1:

Похоже, что вам были предоставлены привилегии для вставки в эту таблицу с помощью роли. А ты был?

Если это так, он работает на уровне SQL или анонимных блоках PL/SQL, но не будет работать в именованных процедурах PL/SQL (например, хранимых процедурах, функциях, триггерах) — вам придется получить этот грант напрямую (не через роль).

Комментарии:

1. Привет, спасибо за подсказку! Когда я создавал пользователя USR1, я использовал оператор: ПРЕДОСТАВИТЬ ТРИГГЕР СОЗДАНИЯ ДЛЯ USR1; Не уверен, как предоставить напрямую?

2. Не тот пользователь grant:), который выполняет ВСТАВКУ В USER1. TEST_DQ_LOG должна быть предоставлена привилегия ВСТАВКИ, т. Е. grant insert on test_dq_log to lorik (или какое бы имя этого пользователя ни было; возможно, USER2?)

3. Действительно, вы правы, это то, что я только что сделал, и это сработало! Большое спасибо!