将会话用户值传递给过程

时间:2016-10-20 16:20:22

标签: sql oracle plsql

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

表:

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.

1 个答案:

答案 0 :(得分:1)

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

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

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

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