将会话用户值传递给过程
Posted
技术标签:
【中文标题】将会话用户值传递给过程【英文标题】:pass session user value to procedure 【发布时间】:2016-10-20 16:20:22 【问题描述】:我在用户 A 中创建了一个过程,以获取属于会话用户(曾经运行过该过程)的表列表并插入到表中。但是当我从用户 B 执行程序时。它没有获取值,我的意思是 session_user 值没有被传递给程序?我enter code here
s 这是预期的行为?有没有一种方法可以在执行过程时传递会话用户而不实际传递它(它自己需要它)?
表格:
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】:您从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以上是关于将会话用户值传递给过程的主要内容,如果未能解决你的问题,请参考以下文章