创建视图时生成 ORA-00942 错误

ORA-00942 error is generating while creating a view

我已经为主用户hfdora创建了一个名为CONS_INTERRUPTED_DATA的新视图,并且该视图已经创建成功。但是,当我在向用户 (cis) 授予所有权限后尝试为同一数据库的另一个用户 (cis) 创建相同的视图时,出现以下错误,

*oms_consumer

第 13 行错误: ORA-00942: table 或视图不存在

用户 hfdora 和 cis 都是同一数据库的一部分,这个 oms_consumer table 存在于数据库中

在创建视图之前,我已经为用户 cis 授予了以下权限

grant select on energization_info to cis;
grant select on trigger_info to cis;
grant select on oms_source to cis;
grant select on oms_consumer to cis;
grant connect,resource,dba to cis;

My sql query to create the view,

>CREATE OR REPLACE VIEW CONS_INTERRUPTED_DATA AS
    SELECT
        trigger_info_A.b1 AS FDR_RMU_OFF_B1, trigger_info_A.b2 AS FDR_RMU_OFF_B2,
        trigger_info_A.B3TEXT AS FDR_RMU_OFF_B3TEXT, trigger_info_A.elem AS FDR_RMU_OFF_ELEM,
        trigger_info_B.b1 AS FDR_RMU_RESTORE_B1, trigger_info_B.b2 AS FDR_RMU_RESTORE_B2,
        trigger_info_B.B3TEXT AS FDR_RMU_RESTORE_B3TEXT,
        trigger_info_B.elem AS FDR_RMU_RESTORE_ELEM,
        oms_consumer.consumer_code, energization_info.b1 AS AFFECTED_B1,
        energization_info.b2 AS AFFECTED_B2, energization_info.b3text AS AFFECTED_B3TEXT,
        to_char(energization_info.deenergized_date, 'DD-MM-YYYY Hh24:MI:SS') AS DEENERGIZED_DATE,
        to_char(energization_info.energized_date, 'DD-MM-YYYY Hh24:MI:SS') AS ENERGIZED_DATE,
        trigger_info_A.comments AS KEY
    FROM
        energization_info, 
        trigger_info trigger_info_A,
        trigger_info trigger_info_B, 
        oms_consumer
    WHERE
        (energization_info.trigger_number = trigger_info_A.trigger_number)
        AND (energization_info.ENERGIZED_TRIGGER_NUMBER = trigger_info_B.trigger_number)
        AND (energization_info.b1 = oms_consumer.B1NAME 
             AND energization_info.b2 = oms_consumer.B2NAME 
             AND energization_info.b3 = oms_consumer.B3NAME)
    WITH READ ONLY;

我的问题已经解决。 :-)

我做了以下修改,

FROM
        hfdora.energization_info, 
        hfdora.trigger_info trigger_info_A,
        hfdora.trigger_info trigger_info_B, 
        hfdora.oms_consumer

现在为用户 cis 创建了相同的视图。

创建视图时诊断问题的第一步是单独尝试 select 部分。在这种情况下,您仍然会收到 ORA-00942 错误,但问题现在只是一个查询和访问问题,与视图无关。

当您得到 ORA-00942: table 或视图不存在 时,这是因为:

  1. 您输入的table或视图名确实不存在。

    • 检查拼写 - 可能有错字。

    • 您是否已连接到存在的数据库?可能您使用的测试系统没有它。

    • 查询 dba_objects 以查看 table 是否存在于另一个架构中。 (如果您没有权限查询 dba_objects,all_objects 列出您有权查看的所有内容,这可能会有所帮助。)

  2. 它确实存在,但它在另一个架构中。
    在那种情况下,有两个可能的问题:

    • 您没有权限查询。 table 的所有者需要 grant read on xyz(将 xyz 的实际 table 名称替换为

      • public(如果你想让每个人都能看到数据,并不总是可取的)

      • a role that you have (but roles aren't used by stored PL/SQL or views,但是,由于您拥有的角色,您可能可以在另一个模式中查询 table,但仍然无法创建使用它的视图或过程。)

    • 您需要指定架构。假设您想查询 HR 中的 REGIONS table,但您连接的是 SCOTT。如果您只是 select * from regions,它会查找不存在的 SCOTT.REGIONS。要解决此问题,请执行以下操作之一:

      • 在您的查询中明确使用 hr.regions

      • 在您的架构中,create or replace synonym regions for hr.regions;
        现在每当您引用 regions 时,数据库将自动重定向到 hr.regions.

      • 在任何模式中有权创建 public 同义词:
        create or replace public synonym regions for hr.regions;
        现在每个连接到数据库的人都会将对 regions 的任何引用重定向到 hr.regions,这并不总是一个好主意,但无论如何这是一个选择。

      • alter session set current_schema = hr;
        现在,用于解析对象名称的默认模式是 HR 而不是您登录的模式。对于始终以与拥有 table 的用户不同的用户身份登录的应用程序,您可以创建一个 after logon trigger,以便始终设置它。然后他们可以只引用 regions 等,而无需指定任何模式和任何同义词。