【问题标题】:Oracle Trigger with INSERT INTO table带有 INSERT INTO 表的 Oracle 触发器
【发布时间】:2021-11-16 20:55:42
【问题描述】:

我正在尝试使用 After Update 语句创建 Oracle 触发器。看来我无法创建触发器,因为我收到 Table does not exist 错误提示:

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'

似乎工作顺利,它在表格中插入行!

【问题讨论】:

    标签: sql oracle triggers


    【解决方案1】:

    您似乎被授予通过角色插入该表的权限。是你吗?

    如果是这样,它适用于 SQL 级别或匿名 PL/SQL 块,但不适用于命名 PL/SQL 过程(例如存储过程、函数、触发器) - 您必须直接(而不是通过角色)获得该授权。

    【讨论】:

    • 您好,感谢您的提示!当我创建用户 USR1 时,我使用了以下语句:GRANT CREATE TRIGGER TO USR1;不确定如何直接授予?
    • 不是授予 :) 执行 INSERT INTO USER1.TEST_DQ_LOG 的用户必须被授予 INSERT 权限,即grant insert on test_dq_log to lorik(或该用户的名称;也许是 USER2?)
    • 确实,你是对的,这就是我刚刚所做的,并且成功了!非常感谢!
    猜你喜欢
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 2019-09-27
    • 1970-01-01
    • 2012-10-12
    • 2012-06-16
    • 1970-01-01
    相关资源
    最近更新 更多