1

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

这里是:

Oracle 客户端:10g Oracle 服务器:11g

我们有 2 个模式和 1 个用户:

SCHEMA1

SCHEMA2

USER

我们有 1 个'TOTO'SCHEMA1( SCHEMA1.TOTO) 中定义的表 我们有一个私有同义词 table 'TOTO',称为'TOTO'defined in 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,然后直接切换到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 错误,然后我们重新启动应用程序几次,它又回来了......

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

非常感谢您的帮助!

4

1 回答 1

3

赠款应转到USER,而不是 SCHEMA2:

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

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

SELECT * FROM all_objects WHERE object_name='TOTO';
于 2012-11-29T18:05:39.030 回答