我在用户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.
答案 0 :(得分:1)
您正在从ALL_TABLES
中进行选择,这是一个由SCHEMAID
和当前用户的其他(内部)表示过滤的视图,而不是SESSION_USER
。因此,当您执行该过程时,您将从用户“A”可以看到但由用户“B”拥有的表列表中进行选择。显然,该列表在您的数据库中是空的。
要按照您的方式进行此项工作,您需要在该过程中使用调用者的权限,如下所示:
CREATE OR REPLACE PROCEDURE "SESS_USR_OBJECTS" AUTHID CURRENT_USER AS...
这样,当它运行时,它将从用户“B”的ALL_TABLES版本中选择。