【问题标题】:pass session user value to procedure将会话用户值传递给过程
【发布时间】:2016-10-20 16:20:22
【问题描述】:

我在用户 A 中创建了一个过程,以获取属于会话用户(曾经运行过该过程)的表列表并插入到表中。但是当我从用户 B 执行程序时。它没有获取值,我的意思是 session_user 值没有被传递给程序?我enter code heres 这是预期的行为?有没有一种方法可以在执行过程时传递会话用户而不实际传递它(它自己需要它)?

表格:

CREATE TABLE "ABCD"
  (    "USERNAME"   VARCHAR2(1`enter code here`00 BYTE),
    "TABLE_NAME" VARCHAR2(100 BYTE)) ;

我正在尝试运行的程序:

  CREATE OR REPLACE PROCEDURE "SESS_USR_OBJECTS" AS
V_USER varchar2(50):= SYS_CONTEXT('USERENV','SESSION_USER');
cursor SEL_CUR is select OWNER,TABLE_NAME from all_tables where owner in (V_USER);
SEL_REC SEL_CUR%ROWTYPE;
VSQL1 VARCHAR2(100);

BEGIN
OPEN SEL_CUR;
LOOP
FETCH SEL_CUR INTO SEL_REC;
EXIT WHEN SEL_CUR%NOTFOUND;

VSQL1:= 'insert into ABCD VALUES ('''||SEL_REC.OWNER||''','''||SEL_REC.TABLE_NAME||''')';
Dbms_Output.Put_Line(VSQL1);
EXECUTE IMMEDIATE VSQL1;
COMMIT;

END LOOP;
CLOSE SEL_CUR;
END;


When I runt the procedure nothing is being inserted into table.
Yes, user B has access to run the procedure in A.

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    您从ALL_TABLES 中选择,这是一个由SCHEMAID 和当前用户的其他(内部)表示过滤的视图,而不是SESSION_USER。因此,当您执行该过程时,您正在从用户“A”可以看到但归用户“B”所有的表列表中进行选择。显然,该列表在您的数据库中是空的。

    要按照您想要的方式进行这项工作,您需要对该过程使用调用者的权限,如下所示:

    CREATE OR REPLACE PROCEDURE "SESS_USR_OBJECTS" AUTHID CURRENT_USER AS...
    

    这样,当它运行时,它将从用户“B”的 ALL_TABLES 版本中进行选择。

    【讨论】:

    • 不确定我是否会将其描述为“技巧”,但不客气 :) 如果您认为我的回答最能回答您的问题,请考虑接受。
    • 确实它不是一个“把戏”。我在这里找到了更多信息:dba-oracle.com/t_authid_current_user.htm
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 2013-09-15
    • 1970-01-01
    • 2020-07-19
    • 2011-07-24
    相关资源
    最近更新 更多