#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. Действительно, вы правы, это то, что я только что сделал, и это сработало! Большое спасибо!