存储过程运行哪个模式?所有者的架构或呼叫者架构?

时间:2017-08-02 08:04:28

标签: oracle stored-procedures

我发现了这个问题。

  • 用户B有一个商店程序" B.pk.sp",用户A可以读取 " B.pk.sp"并执行它。
  • 程序" B.pk.sp"在没有架构属性的情况下操纵表 用户B。

这使我感到困惑的是,如果用户A调用" B.sk.sp"会操纵用户B表还是会操纵用户A表?

感谢您阅读此问题。

1 个答案:

答案 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,程序(或程序包)将操纵其所有者架构中的表(而不是调用者的架构)。