【问题标题】:Creating VIEW in system level在系统级别创建 VIEW
【发布时间】:2009-07-25 00:17:08
【问题描述】:

我在域架构级别使用CREATE OR REPLACE VIEW 语句创建了VIEW

create or replace VIEW SERV as
select loop.loop_serv serv, component.cmpnt_id,component.loop_id
from component,loop where component.loop_id = loop.loop_id 
union select distinct ' ',0,0 from component,loop;

因此,如果我登录到域架构并运行查询 - select * from domain1.SERV,那么我将获得预期的所有结果。

现在我已经为所有域模式重用了上面的 create 语句,如果我想一次性查看所有结果,那么我会使用带有“union select”的查询,因为可以理解,视图在整个过程中具有相同的格式.

select * from domain1.SERV union all 
select * from domain2.SERV union all 
select * from domain3.SERV union all 
select * from domain4.SERV union all 
select * from domain5.SERV union all

以此类推,直到最后一个域模式。

现在我怎么能在系统级别创建相同的视图,知道在“all_object”表中它将列出我的视图(object_type='VIEW'object_name='SERV')并且“所有者”列将是我的所有域架构列表。此系统级别的 VIEW 例如名称为 ALL_SERV,如果我在其中运行查询,它将列出来自所有域模式的所有记录。

那你能帮忙吗?


我根本没有创建对象。我只想在系统级别创建相同的视图。 VIEW 的结构应与我在领域级别创建的相同。我想我必须创建指向每个域的 VIEW,这意味着我有 x 个视图作为域的数量。

还有其他简单的方法吗?

【问题讨论】:

  • 您在寻找动态的吗?因此,如果您添加另一个域,它会自动反映在视图中?
  • 您实际上根本没有在 SYSTEM 模式下创建对象,是吗?那将是一件坏事。

标签: sql database oracle


【解决方案1】:

要将视图置于“系统级别”(如您所说),您需要一个公共同义词。我假设这是您使用的名称的 Oracle。试试:

CREATE OR REPLACE PUBLIC SYNONYM serv FOR domain1.serv;

为此,您需要适当的权限,即CREATE PUBLIC SYNONYM。用户将需要目标的对象权限才能选择它(即同义词不允许某人访问他们无法访问的东西)。

话虽如此,您使用的工会数量非常多。我会对此保持警惕。

【讨论】:

    【解决方案2】:

    我已经解决了这个问题。我所需要的只是授予权限。

    GRANT SELECT ANY TABLE TO IN_DBAMN;
    

    就是这样。

    现在我可以在系统级别创建 VIEW。

    CREATE OR REPLACE VIEW ALL_SERV 
    as 
    ( 
        select * from domain1.serv union all select * from domain2.serv union all etc... 
    );
    

    一旦在其域级别修改任何数据,此视图也会更新。

    【讨论】:

    • 为每个架构分别将“domain1”更改为“domain2”等。您可以通过查询 ALL_OBJECTS 视图生成所需的 SQL。
    • 如果您还有其他问题,您可能需要将其作为新问题提出。
    • 谢谢杰夫。我已经为每个域创建了公共同义词,现在您知道如何将每个公共同义词组合到一个公共同义词。有可能吗?
    猜你喜欢
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    相关资源
    最近更新 更多