【问题标题】:Oracle: why I can't select from VIEW using <SCHEMA_NAME>.<VIEW_NAME>?Oracle:为什么我不能使用 <SCHEMA_NAME>.<VIEW_NAME> 从 VIEW 中进行选择?
【发布时间】:2019-03-16 19:43:28
【问题描述】:

我正在处理的核心产品发生了一些变化,一些表变成了现在的视图,它们不再工作了,因为无法使用前面的架构名称引用视图。

例如下面会返回错误:ORA-00942: table or view does not exist

select * from my_schema.my_view;

虽然从视图中直接选择可以正常工作

select * from my_view;

如果是表,上述两种情况都可以正常工作,只是视图不接受前面的schema_name。

这是为什么呢?有没有体面的解决方法?

编辑:选择由 my_schema 用户执行

【问题讨论】:

  • MY_VIEW 现在可能是指向视图的公共同义词,而您自己的架构中没有同名的视图(或表)。在考虑解决方法之前,请先尝试找出原因。
  • 你可以做这样的事情......我知道我可以从 V$VERSION 中选择,但不能从“我的模式”.V$VERSION 中选择。然后我可以运行select * from all_objects where object_name = 'V$VERSION'; - 这表明 V$VERSION 是公共同义词(不是视图!)
  • @mathguy 它找不到 my_schema.V$VERSION。运行第二个选择它会找到公共同义词。
  • 我希望你没有完全按照我写的那样运行声明,V$VERSION。当你用MY_VIEW 运行它时,你会得到什么? (假设这是您要查找的真实视图名称 - 如果不是,请根据需要替换!)
  • @mathguy 我认为您对公共同义词的理解是正确的。 my_view 是 my_view_r 的公共同义词。我可以从 my_schema.my_view_r 查询。我可以为 my_view_r 添加另一个同义词 my_schema.my_view 吗?

标签: oracle select view schema


【解决方案1】:

感谢大家的帮助,尤其是@mathguy。

基本上问题在于 my_view 实际上是 my_view_r 的公共同义词,它是实际视图并且是公共的,您不能像我尝试的那样使用前面的模式名称来调用它。例如:

select * from my_schema.my_view;

也许这对将来遇到此问题的其他人会有所帮助,解决方法是使用如下架构名称为同一视图 (my_view_r) 创建一个私有同义词:

create synonym my_schema.my_view for my_view_r;

这是使用模式名称调用同义词的唯一方法。

【讨论】:

    【解决方案2】:

    通过运行确保您的架构确实是所有者:

    Select * from all_objects where object_name = 'my_view';
    

    我有一个视图 stvytro 与所有者 baninst1。有一个同名的公共同义词。以下两者都有效:

    select * from STVYTRO;
    select * from baninst1.stvytro;
    

    【讨论】:

      【解决方案3】:

      这是一个拨款问题。

      grant all on my_view to my_schema
      

      【讨论】:

      • 感谢迭戈的回复。这不是授权问题,因为 my_view 是 my_schema 的一部分,我使用 my_schema 用户执行选择。
      • @Alin - 你确定 MY_VIEW 是 MY_SCHEMA 的一部分吗?你怎么知道?只是从中选择(没有其他证据)并不是决定性的。我可以从 V$VERSION 中进行选择,但我的架构中没有该名称的视图。
      猜你喜欢
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 2013-09-01
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多