oracle 为什么出现错误“ORA-01720:当存在Public. Dual?

acruukt9  于 2023-08-04  发布在  Oracle
关注(0)|答案(3)|浏览(276)

我在使用Oracle 11 g,我确实理解第三方授权的问题。
但是,假设user 1创建了一个视图“view 1”作为Select 'foo' from dual。
然后,我将Select on view 1授予user 2,并得到此错误。
但是请注意,视图中的“dual”并不限定为sys.dual,它只是dual。我认为使用同义词public.dual,实际使用的“dual”应该是public.dual,而不是sys.dual,因此不应该存在第三方问题,因为它是公共的。
如果sys.dual是Oracle在这个视图中假设的,人们会认为,鉴于在视图中使用dual是很常见的,并且向其他用户授予视图的权限也很常见--难道成千上万的用户不会报告这个问题吗?
我确实看到了关于这个问题的零星帖子,但除了为创建视图的用户创建另一个dual副本之外,没有真实的的解决方案,但这对我来说没有意义。谢谢你的帮助

m1m5dgzv

m1m5dgzv1#

在咨询我们的数据库管理员后,问题是11.2.0.4中的Oracle“特性”:
TL;DR版本:从v11.0.4开始,如果你的View使用Dual,那么你不能授予这个View除SELECT之外的任何权限。
为什么我们要授予比“选择”更多的视图?在我们的例子中,应用程序供应商以这样一种方式打包了他们的更新,即更新的数据库部分自动脚本化完整的CRUD赠款给每个新对象上的主应用程序模式,这包括视图,因为这样更容易编写脚本。这一切都很好,直到11.0.4,当甲骨文说/强制“嘿,你不能这样做”。
完整版本:
(引用自Oracle站点https://support.oracle.com/epmos/faces/BugDisplay?parent=DOCUMENT&sourceId=1628033.1&id=17994036
Oracle Database - Enterprise Edition -版本11.2.0.4至11.2.0.4 [版本11.2]本文档中的信息适用于任何平台。症状从www.example.com升级到11.2.0.311.2.0.4后,在执行“create or replace view”语句时遇到以下错误:ORA-01720:grant option does not exist视图是在升级之前创建的,并且“CREATE OR REPLACE VIEW”工作正常。原因观察到的行为是正确的。当REPLACEN一个从其他用户的表中进行选择的视图并且以下两个条件都为真时,您将得到此ORA-1720错误:

  • 您已经将VIEW上的选择或其他权限授予了其他用户
  • 视图所有者在要选择的表上没有GRANT选项(或者视图所有者可能对grant选项具有某些特权,但对其他特权没有)Development对此进行了如下解释:

www.example.com中的代码已更改11.2.0.4,因此创建视图的行为与grant类似。如果您尝试在现有视图上进行GRANT,而视图所有者没有grant选项,则ORA-1720是预期的结果(即使在www.example.com中11.2.0.3)11.2.0.4。如果存在不兼容的授权,则必须不允许新的视图定义(即使使用FORCE)。换句话说,我们不允许不兼容的赠款与视图定义共存,因此必须抛出错误。发布11.2.0.3(及更早版本)中的行为不正确; www.example.com中的新行为11.2.0.4是有意的且正确的。要避免此问题,您可以执行以下操作之一:
1.在替换视图之前删除视图上的所有赠款。这将确保不存在不兼容的赠款。
1.删除并重新创建视图。删除视图将自动删除所有赠款。
参考错误:17994036 -发布升级到11.2.0.4创建或替换ORA-01720错误:18024486 - ORA-1720创建视图时出现故障,之后从11.2.0.3.0升级到11.2.0.4.0

wr98u20j

wr98u20j2#

使用sys(as sysdba)数据库用户授予必要的权限,然后尝试使用sys(as sysdba)数据库用户重新创建视图。这对我很有帮助。
问候,花瓶Tusevski

j2qf4p5b

j2qf4p5b3#

作为一个类似的问题,我需要创建一个基于公共表表达式查询的OracleVIEW,该查询涉及SYS.USER_OBJECTS和(SYS.)DUAL。当SQL单独工作时,当嵌入到**CREATE OR REPLACE VIEW ...**中时,我从这个线程的前面得到了消息。
我的回答是:
1.定义一个与我的结果集匹配的ObjectTYPE(只有1列,但大概这不是限制)
1.基于对象类型定义表类型
1.创建一个TABLE函数来遍历正在工作的SQL的结果集,并创建一个结果TABLE。
1.重新创建原始视图以针对功能进行选择。我还没有解决这个问题,那么用户就可以被赋予对视图的适当的SELECT权限。他们可能还需要函数上的EXECUTE特权和TYPE对象上的天知道的特权。
所以 (当然,YMWV由于网站特定的表的东西在这里…)

DROP VIEW V_BRIDGE_RELATED_TABLES_DELETE_TARGETS;
    DROP TYPE t_tn_tab;
    create or replace TYPE t_tn_row as object (table_name VARCHAR2(128));
    / 
    create or replace TYPE T_TN_TAB  as table of t_tn_row;
    / 
    
    CREATE OR REPLACE FUNCTION GET_BRIDGE_RELATED_TABLES_DELETE_TARGETS
    RETURN T_TN_TAB AS
    
    l_tab t_tn_tab := T_TN_TAB();
    
    begin
    
     for cur_r in (
    
    WITH CTE AS
     ( SELECT DISTINCT TABLE_NAME
        from USER_TAB_COLS utc
       INNER JOIN USER_OBJECTS uo
          ON (utc.TABLE_NAME = uo.OBJECT_NAME and uo.OBJECT_TYPE = 'TABLE')
       where utc.COLUMN_NAME = 'BRIDGE_GD'
         AND utc.TABLE_NAME NOT IN ('BRIDGE',
                                    'INSPEVNT',
                                    'ROADWAY',
                                    'STRUCTURE_UNIT',
                                    'KDOTBLP_BRIDGE',
                                    'KDOTBLP_INSPECTIONS',
                                    'USERBRDG',
                                    'USERINSP')
         and utc.TABLE_NAME NOT IN
             (SELECT name
                from sys.all_dependencies
               where type = 'MATERIALIZED VIEW'
                 and referenced_type = 'TABLE'
                 and owner = 'KDOT_BLP'
                 and name = referenced_name)
            -- lots of exclusions for transitional stuff in Portal database
         AND utc.TABLE_NAME NOT LIKE 'MV_%'
         AND utc.TABLE_NAME NOT LIKE '%_MV'
         AND utc.TABLE_NAME NOT LIKE '%_BAK'
         AND utc.TABLE_NAME NOT LIKE '%_BKU'
         AND utc.TABLE_NAME NOT LIKE '%_TEMP'
         AND utc.TABLE_NAME NOT LIKE '%_TMP'
         AND utc.TABLE_NAME NOT LIKE '%_T'
         AND utc.TABLE_NAME NOT LIKE '%_KT'
         AND utc.TABLE_NAME NOT LIKE 'ARC_%'
         AND utc.TABLE_NAME NOT LIKE '%_AR'
         AND utc.TABLE_NAME NOT LIKE '%_BACKUP'
         AND utc.TABLE_NAME NOT LIKE '%_NEW_%'
         AND utc.TABLE_NAME NOT LIKE '%_NEW'
         AND utc.TABLE_NAME NOT LIKE '%_RENAMED'
         AND utc.TABLE_NAME NOT LIKE '%_RENAMED%'
         AND utc.TABLE_NAME NOT LIKE '%_TRANSFORM'
         AND utc.TABLE_NAME NOT LIKE 'TMP%'
         AND utc.TABLE_NAME NOT LIKE '%_202%'
      UNION
      SELECT 'KDOTBLP_BRIDGE' AS TABLE_NAME
        FROM DUAL
      UNION
      SELECT 'KDOTBLP_INSPECTIONS' AS TABLE_NAME
        FROM DUAL
      UNION
      SELECT 'KDOTBLP_LOAD_RATINGS' AS TABLE_NAME
        FROM DUAL
      UNION
      SELECT 'KDOTBLP_QAQC_REVIEW_FINDINGS' AS TABLE_NAME
        FROM DUAL
      UNION
      SELECT 'KDOTBLP_QAQC_REVIEW_FLAGS' AS TABLE_NAME
        FROM DUAL
      UNION
      SELECT 'KDOTBLP_DOCUMENTS' AS TABLE_NAME
        FROM DUAL
      UNION
      SELECT 'USERSTRUNIT' AS TABLE_NAME
        FROM DUAL
      UNION
      SELECT 'USERRWAY' AS TABLE_NAME
        FROM DUAL
      UNION
      SELECT 'USERBRDG' AS TABLE_NAME
        FROM DUAL
      UNION
      SELECT 'USERINSP' AS TABLE_NAME
        FROM DUAL) 
    SELECT DISTINCT (TABLE_NAME) AS TABLE_NAME  
    FROM CTE    
    GROUP BY CTE.TABLE_NAME 
    ORDER BY 1  
      ) loop
     l_tab.extend;
     l_tab(l_tab.last) := t_tn_row(cur_r.TABLE_NAME);
      end loop;
      return l_tab;
    end GET_BRIDGE_RELATED_TABLES_DELETE_TARGETS;
    /
    
    CREATE OR REPLACE VIEW V_BRIDGE_RELATED_TABLES_DELETE_TARGETS AS
    select * from TABLE(GET_BRIDGE_RELATED_TABLES_DELETE_TARGETS());
    /
    
    GRANT EXECUTE ON GET_BRIDGE_RELATED_TABLES_DELETE_TARGETS TO PUBLIC;
    
    GRANT SELECT ON  V_BRIDGE_RELATED_TABLES_DELETE_TARGETS TO PUBLIC;

字符串
这确实给予了我想要的视野

相关问题