将会话用户值传递给过程

Posted

技术标签:

【中文标题】将会话用户值传递给过程【英文标题】: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.

【问题讨论】:

【参考方案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

以上是关于将会话用户值传递给过程的主要内容,如果未能解决你的问题,请参考以下文章

REACTJS 和 API 将 Api 的值传递给另一个页面

如何拆分传递给pl sql过程的参数值

如何将全局过滤器值传递给数据库上下文

如何通过实体框架将空值传递给存储过程?

将函数返回值传递给存储过程参数

VB中过程调用时有几种参数传递方式,说明其区别