【问题标题】:Oracle - checking privileges during compileOracle - 在编译期间检查权限
【发布时间】:2015-03-10 09:26:20
【问题描述】:

当我使用以下方法编译视图时:

ALTER VIEW schema.vwName COMPILE;

我得到“执行成功”。但是当我尝试从视图中选择数据时出现错误:'ORA-01031:权限不足'。我了解错误消息以及导致该错误的原因(模式没有选择在另一个模式中表的权限)。我想知道是否有办法在视图编译期间获取有关此类错误的信息,或者是否有其他命令可以在不从视图中选择数据的情况下进行检查?

我正在更改 db 中的权限,我想确保所有视图和过程都正常,并且用户在选择或执行期间不会收到错误 ORA-01031。

谢谢

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    我认为您可能已经使用 force 关键字创建了您的视图,尽管没有因缺少对象或权限而导致编译错误。示例:

    # shema1
    create table test_table ( column1 varchar2(10));
    
    grant select on test_table to shema2;
    
    #shema2
    create or replace view test_view as select column1 from shema1.test_table; --works/no error
    
    # shema1
    revoke select on test_table from shema2;
    
    # shema2
    alter view test_view compile; --Gives ORA-00941: Table or view does not exist
    
    create or replace force view test_view as select column1 from shema1.test_table; --gives no error, due to force keyword
    
    alter view test_view compile; --gives no error, due to force keyword
    

    或者反过来说:如果你想通过编译检查你的视图,你可能不会在视图定义中使用force

    强制 如果要创建视图,无论视图的基表或引用的对象类型是否存在,或者包含该视图的模式的所有者是否对它们具有权限,请指定 FORCE。在针对视图发出任何 SELECT、INSERT、UPDATE 或 DELETE 语句之前,这些条件必须为真。

    docs.oracle

    【讨论】:

    • 你是对的,视图是使用强制创建的。有没有办法在不重新创建视图的情况下处理这个问题?
    • 至少我不知道...但是如果您没有明确需要 forceKeyword (用于自动部署或其他),通过重新创建删除可能是个好主意无论如何。
    猜你喜欢
    • 2015-10-29
    • 2020-07-27
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多