我发现了这个问题。
这使我感到困惑的是,如果用户A调用" B.sk.sp"会操纵用户B表还是会操纵用户A表?
感谢您阅读此问题。
答案 0 :(得分:5)
在您定义过程时,它取决于invoker rights clause (i.e. AUTHID CURRENT_USER
)设置。
Oracle安装程序:
CREATE USER A IDENTIFIED BY APassword;
CREATE USER B IDENTIFIED BY BPassword;
CREATE TABLE A.your_table ( id ) AS SELECT 'A' FROM DUAL;
CREATE TABLE B.your_table ( id ) AS SELECT 'B' FROM DUAL;
CREATE PROCEDURE A.test_invoker_rights( id OUT VARCHAR2 ) AUTHID CURRENT_USER
AS
BEGIN
SELECT id INTO id FROM your_table WHERE ROWNUM = 1;
END;
/
GRANT EXECUTE ON A.test_invoker_rights TO B;
现在考虑PL / SQL脚本:
SET SERVEROUTPUT ON;
DECLARE
ID VARCHAR2(1);
BEGIN
A.test_invoker_rights(id);
DBMS_OUTPUT.PUT_LINE(id);
END;
/
如果您以用户A
的身份运行,则输出为A
;但如果您以用户B
运行它,则输出为B
。
现在,如果您重新定义过程以获得标题:
CREATE PROCEDURE A.test_invoker_rights( id OUT VARCHAR2 ) AUTHID DEFINER
或使用默认调用者的权限(通过省略该子句):
CREATE PROCEDURE A.test_invoker_rights( id OUT VARCHAR2 )
然后,如果您以用户A
运行它,那么输出为A
;但是如果您以用户B
运行它,那么输出仍然是A
。
默认值为AUTHID DEFINER
,程序(或程序包)将操纵其所有者架构中的表(而不是调用者的架构)。