以下是我的情景:
架构: USER_1 打包: PKG_1 程序: PROC_1 表: MY_TABLE
架构: USER_2
所以我有两个架构, USER_2 几乎与 USER_1 中的每个表都有同义词,它还有 PKG_1.PROC_1的同义词 ,更新 MY_TABLE 。但是,对 PKG_1.PROC_1 使用 USER_2 同义词时, USER_1 而非 USER_2 的过程更新表...
我如何操作来自执行另一个模式中过程同义词的相同模式的表?
基本上,我期望实际看到 USER_2.MY_TABLE 的更改,但没有在那里进行任何更改......
我是通过 USER_2 :
完成的CREATE OR REPLACE SYNONYM MY_TABLE FOR USER_1.MY_TABLE;
CREATE OR REPLACE SYNONYM PKG_1 FOR USER_1.PKG_1;
EXECUTE PKG_1;
我没有任何错误,甚至在连接到 USER_2 时,DBMS_OUTPUT.PUT_LINE
日志也可见且正确。但是,如果我这样做,请 PKG_1.PROC_1 删除 MY_TABLE 中的记录:
SELECT RECORD FROM MY_TABLE;
使用USER_2,我可以看到记录未被删除,但是:
SELECT RECORD FROM USER_1.MY_TABLE;
已删除。
感谢您的时间!
答案 0 :(得分:0)
要让包对调用者的模式中的对象进行操作,您需要在包(也就是调用者权限包)上声明AUTHID CURRENT_USER。
默认值为AUTHID DEFINER,允许包对与包本身相同的模式提供的对象进行操作。