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

Cen*_*xui 1 oracle stored-procedures

我发现了这个问题.

  • 用户B有一个存储过程"B.pk.sp",用户A可以读取"B.pk.sp"并执行它.
  • 过程"B.pk.sp"操作没有模式的表属于用户B.

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

感谢您阅读此问题.

MT0*_*MT0 5

它取决于定义过程时设置的调用者权限子句(即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;
Run Code Online (Sandbox Code Playgroud)

现在考虑PL/SQL脚本:

SET SERVEROUTPUT ON;
DECLARE
  ID VARCHAR2(1);
BEGIN
  A.test_invoker_rights(id);
  DBMS_OUTPUT.PUT_LINE(id);
END;
/
Run Code Online (Sandbox Code Playgroud)

如果以用户身份运行,A则输出为A; 但如果你以用户身份运行它,B那么输出就是B.

现在,如果您重新定义过程以获得标题:

CREATE PROCEDURE A.test_invoker_rights( id OUT VARCHAR2 ) AUTHID DEFINER
Run Code Online (Sandbox Code Playgroud)

或者使用默认的调用者权限(通过省略该子句):

CREATE PROCEDURE A.test_invoker_rights( id OUT VARCHAR2 )
Run Code Online (Sandbox Code Playgroud)

然后,如果你以用户身份运行它,A那么输出就是A; 但如果你以用户身份运行它,B那么输出仍然是A.

默认值是AUTHID DEFINER,过程(或包)将操纵其所有者模式中的表(而不是调用者的模式).

  • @RogueCoder是的......但问题是"程序操纵表**没有架构**"; 因此,指定架构会使问题的前提无效. (2认同)