【问题标题】:Select statement stops working when wrapped in view [Oracle]Select 语句在视图中包装时停止工作 [Oracle]
【发布时间】:2023-03-27 15:14:01
【问题描述】:

我在存储过程中有一个 select 语句,我想将它取出并放入一个视图中。 select 语句从 dba_tables、dba_tab_partitions 和 dba_tab_subpartitions 中提取。

如果我自己运行该语句,它可以正常工作。如果我将它包装在创建视图语句中:

CREATE OR REPLACE VIEW "MYSCHEMA"."V_XWMS_TEST"
(
"OWNER"
,"SEGMENT_NAME"
,"PARTITION_NAME"
,"SEGMENT_TYPE"
,"TABLESPACE_NAME"
)
AS
SELECT "OWNER"
,"SEGMENT_NAME"
,"PARTITION_NAME"
,"SEGMENT_TYPE"
,"TABLESPACE_NAME"
FROM
[Original query]

然后根据我登录的用户,我得到 ORA-01031:权限不足或 ORA-00942:表或视图不存在。同样,对于两个用户,我都可以创建视图,并且可以运行这个 select 语句,但是我不能在创建视图的上下文中运行 select 语句。

【问题讨论】:

  • 您的用户是否有权读取该视图中包含的所有表?
  • 是的 - 两个用户都可以自己运行 select 语句并获得预期的结果。

标签: oracle


【解决方案1】:

这可能是由系统权限SELECT ANY DICTIONARY和角色SELECT_CATALOG_ROLE之间的差异造成的。

从表面上看,他们通过授予用户访问数据字典的权限来做同样的事情。其中任何一个都可以让用户对DBA_TABLES 之类的表运行查询。

不同之处在于角色在创建具有定义者权限的对象时启用,并且视图始终是定义者权限。因此,要使视图正常工作,用户将需要系统权限SELECT ANY DICTIONARY,或对单个对象进行类似的直接授权。

【讨论】:

  • 授予选择任何字典允许我创建视图。谢谢!
【解决方案2】:

ORA-01031:权限不足或 ORA-00942:表或视图不存在。

这个错误意味着创建视图的新表没有同义词和授权,以供创建视图的架构访问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-16
    • 2022-12-02
    • 2020-12-16
    • 2021-02-05
    • 2013-09-15
    • 1970-01-01
    • 2021-10-31
    • 2011-08-25
    相关资源
    最近更新 更多