Cen*_*xui 1 oracle stored-procedures
我发现了这个问题.
这让我感到困惑的是,如果用户A调用"B.sk.sp"会操纵用户B表还是会操纵用户A表?
感谢您阅读此问题.
它取决于定义过程时设置的调用者权限子句(即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,过程(或包)将操纵其所有者模式中的表(而不是调用者的模式).