【问题标题】:Get owner of the current view in Oracle获取 Oracle 中当前视图的所有者
【发布时间】:2020-10-01 12:43:48
【问题描述】:

我想创建一个视图,其中包含一个引用该视图所有者的列。类似的东西:

create or replace view scott.owner_v 
as
select something() owner from dual;

注意something() 不一定是函数或包引用。它可以是任何能提供所需输出的东西。

例如,在JEREMY 用户下查询select owner from scott.owner_v 将返回SCOTT,当我在HR 架构中编译此类视图时,我在owner 列中得到HR

也许查询SCOTT.owner_v 以获取SCOTT 似乎很愚蠢,但在构建DWH 时我需要它来引用位于不同模式中的不同源。因此,我将动态构建一个“更高”级别的新视图,该视图从所有模式中收集数据,并带有额外的列,如 owner,它显示了数据源。我可以在构建这个“更高”的视图时放置这个专栏,但我想让它尽可能简单。

显然,我试图将以下参数放入视图中

  • sys_context('USERENV','CURRENT_USER')
  • sys_context('USERENV','CURRENT_SCHEMA')
  • 用户

但它指的是当前登录的用户而不是视图的所有者。

任何帮助表示赞赏。

【问题讨论】:

  • 如果您正在动态构建视图,为什么不能将所有者作为常量值包含在内 - 您应该已经在 CREATE 语句中根据需要(使用)该名称跨度>
  • 我想将所有逻辑保存在保存源数据的“阶段”模式中。在下一个级别上,您只需查看 UNION 的所有来源。

标签: oracle view


【解决方案1】:

只需创建本地函数,它会在您要创建视图的所有模式中返回自己的模式:

create or replace function local_obj_owner return varchar2 as
begin
   return $$PLSQL_UNIT_OWNER;
end;
/

然后将其添加到您的视图中:

create view test_view as
select
  local_obj_owner as view_owner,
  dummy
from dual;

【讨论】:

  • 忘了提到我在 Oracle 11g 上,所以 $$PLSQL_UNIT_OWNER 返回 NULL。但我把它改成了sys_context('USERENV', 'CURRENT_USER'),记住这个函数是AUTHID DEFINER
【解决方案2】:

试试

select owner from all_views where view_name = 'OWNER_V';

和/或一些替代方案(USER_VIEWSDBA_VIEWSALL_OBJECS、...)。

【讨论】:

  • 如果一个视图持有模式只知道它的视图,但我不想涉及在另一个模式中没有对同一视图的授权。
猜你喜欢
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 2013-06-17
  • 2017-12-04
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多