如何解决创建视图时生成 ORA-00942 错误
我为主用户 hfdora 创建了一个名为 CONS_INTERRUPTED_DATA 的新视图,并且该视图已成功创建。但是,当我在将所有权限授予用户 (cis) 后尝试为同一数据库的另一个用户 (cis) 创建相同的视图时,出现以下错误,
*oms_consumer
第 13 行的错误: ORA-00942: 表或视图不存在
用户 hfdora 和 cis 都是同一个数据库的一部分,这个 oms_consumer 表存在于数据库中
在创建视图之前,我已经为用户 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:表或视图不存在时,这是因为:
-
您输入的表或视图名称确实不存在。
-
检查拼写 - 可能有拼写错误。
-
您是否连接到存在的数据库?也许您在一个没有它的测试系统上。
-
查询
dba_objects
以查看该表是否存在于另一个架构中。 (如果您没有查询 dba_objects 的权限,all_objects
会列出您有权查看的所有内容,这可能会有所帮助。)
-
-
它确实存在,但它在另一个架构中。
在这种情况下,有两个可能的问题:-
您无权查询。表的所有者需要
grant read on xyz
(用实际的表名代替xyz
)到 -
您需要指定架构。假设您要查询
REGIONS
中的HR
表,但您已连接为SCOTT
。如果您只是select * from regions
,它将查找不存在的SCOTT.REGIONS
。要解决此问题,请执行以下操作之一:-
在查询中明确使用
hr.regions
。 -
在您的架构中,
create or replace synonym regions for hr.regions;
现在每当您引用regions
时,数据库都会自动重定向到hr.regions
。 -
在任何具有创建公共同义词权限的架构中:
create or replace public synonym regions for hr.regions;
现在,连接到数据库的每个人都将对regions
的任何引用重定向到hr.regions
,这并不总是一个好主意,但无论如何它都是一种选择。 -
alter session set current_schema = hr;
现在,解析对象名称的默认架构是HR
而不是您登录的架构。对于始终以与拥有表的用户不同的用户身份登录的应用程序,您可以创建一个 after logon trigger 以便始终设置它。然后他们可以只引用regions
等,而无需指定任何架构,也无需任何同义词。
-
-
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。