创建视图时生成 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 或视图不存在 时,这是因为:
您输入的table或视图名确实不存在。
检查拼写 - 可能有错字。
您是否已连接到存在的数据库?可能您使用的测试系统没有它。
查询 dba_objects
以查看 table 是否存在于另一个架构中。 (如果您没有权限查询 dba_objects,all_objects
列出您有权查看的所有内容,这可能会有所帮助。)
它确实存在,但它在另一个架构中。
在那种情况下,有两个可能的问题:
您没有权限查询。 table 的所有者需要 grant read on xyz
(将 xyz
的实际 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
等,而无需指定任何模式和任何同义词。
我已经为主用户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 或视图不存在 时,这是因为:
您输入的table或视图名确实不存在。
检查拼写 - 可能有错字。
您是否已连接到存在的数据库?可能您使用的测试系统没有它。
查询
dba_objects
以查看 table 是否存在于另一个架构中。 (如果您没有权限查询 dba_objects,all_objects
列出您有权查看的所有内容,这可能会有所帮助。)
它确实存在,但它在另一个架构中。
在那种情况下,有两个可能的问题:您没有权限查询。 table 的所有者需要
grant read on xyz
(将xyz
的实际 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
等,而无需指定任何模式和任何同义词。