【问题标题】:Oracle synonym randomly not viewableOracle 同义词随机不可见
【发布时间】:2012-11-29 17:04:15
【问题描述】:

这是一个棘手的案例,包括 DBA 在内的 5 个人一直在苦苦挣扎数天...我会终身考虑将找出问题根本原因的案例。

这里是:

Oracle 客户端:10g 甲骨文服务器:11g

我们有 2 个架构和 1 个用户:

SCHEMA1

SCHEMA2

USER

我们有 1 个表 'TOTO' 定义在 SCHEMA1 (SCHEMA1.TOTO) 我们有一个私有的同义词表'TOTO',称为'TOTO',定义在SCHEMA2中,创建如下:

CREATE SYNONYM SCHEMA2.TOTO FOR SCHEMA1.TABLE1;

我们已将“SCHEMA2.TOTO”(同义词等)上的 SELECT、UPDATE、DELETE、INSERT 权限授予 SCHEMA2(以便从 SCHEMA2 运行的任何会话都可以访问同义词表)

GRANT SELECT, UPDATE, DELETE, INSERT ON SCHEMA2.TOTO TO SCHEMA2;

我们的应用使用USER连接DB,然后直接切换到SCHEMA2

ALTER SESSION SET CURRENT_SCHEMA=SCHEMA2;

然后,它尝试在同义词表上执行选择查询,而不用 SCHEMA1 作为同义词名称的前缀(这是我们使用的框架的约束):

SELECT COL FROM TOTO;

大多数情况下,此查询都能成功运行,这是我们所期望的,因为我们已将会话更改为 SCHEMA2,默认情况下是查看对象的位置。

但有时它会失败,出现ORA-00942: table or view does not exist 错误。

我坚持这样一个事实,即在它工作和失败之间,没有任何改变,我们只是重新启动了应用程序(当然,每次启动时都会以相同的方式重新连接到数据库)。 我们已经与监控 USER、SCHEMA1、SCHEMA2 上的所有事件的 DBA 进行了调查,希望找到一个外部进程在其中一个上修改 GRANTS,在成功和失败之间,但没有任何变化。然而,在某些时候,我们随机收到 ORA-00942 错误,然后我们重新启动应用程序几次,它又回来了......

有人有什么想法或任何建议/提示可以引导我们找出我们在这里缺少的东西吗?

非常感谢您的帮助!

【问题讨论】:

    标签: oracle random synonym


    【解决方案1】:

    赠款应该发给USER,而不是SCHEMA2:

    GRANT SELECT, UPDATE, DELETE, INSERT ON schema1.toto TO userxy;
    

    这应该可以解决问题。如果没有,请您发布结果

    SELECT * FROM all_objects WHERE object_name='TOTO';
    

    【讨论】:

    • 这似乎解决了问题,并明确了应该如何完成。谢谢!但是我仍然很难理解为什么有时没有它就可以工作......显然它不应该所以必须有一个我们没有考虑的外部因素(可能在我们用于创建模式的工具和框架上)这与 USER 的 GRANT 相混淆。
    • 您确保 GRANTS 没有改变,所以只想到了三个进一步的嫌疑人:1) 一个改变的 PUBLIC SYNONYM 绕过名称解析,2) 一个改变的角色,如 DBA 或 SELECT_CATALOG_ROLE,它绕过授权系统或 3) 更改连接 AS SYSDBA。不过,这三个都不太可能。
    猜你喜欢
    • 1970-01-01
    • 2011-10-06
    • 2021-09-17
    • 2011-05-01
    • 2010-09-21
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多