1

一个外部数据库管理员导出了一个生产数据库并将其导入到测试环境中。我们使用的是 Oracle 9.2。大多数导入的数据库对象(表、视图、idexes、包...)工作正常,但我们对三个特定表有问题:我们可以在这些表上执行 SELECT、UPDATE、DELETE,但我们不能在此创建视图表。

换句话说,以下工作:

 create or replace view v_test_view as select 1 x from dual; // we can create views
 create or replace view v_test_view  as select 1 x from someTable;
 select * from problematicTable; // we can select data from problematic table

但这不起作用:

 create or replace view v_test_view  as select 1 x from problematicTable;
--> ORA-01031: insufficient privileges

背景资料:

  • db admin 使用导入/导出实用程序复制数据库架构
  • 生产和测试Oracle的版本不完全相同(生产是9.2.0.8,测试是9.2.0.7)
  • 初始导入完成后,有问题的表在对象目录(和数据库开发工具)中可见,但是当尝试从该表中选择时,我们得到了“无效标识符”。之后,表被重新导入,现在我们可以从中选择,但不能在它们上创建视图

有任何想法吗?

更新: 看起来情况更加奇怪。当使用一个 oracle 会话时,我们可以从该表中选择数据,在另一个 Oracle 会话中(使用同一用户登录!),我们得到“ORA-00904:无效标识符”

更新#2: 用于导入的导出数据已成功用于将数据导入另一个测试环境(我们称之为 TEST1),该环境与有问题的环境(TEST2)位于 Oracle 的同一实例上。这两个环境之间的区别在于 TEST1 使用与生产相同的用户(模式名称),但 TEST2 使用另一个用户(因此对象被导入另一个模式名称)。有问题的表没有任何与正常工作的表不同的特殊安全属性。

马特拉

4

2 回答 2

3

用户是否通过 ROLE 在有问题的表上创建视图授予选择?如果是这样,请尝试在表上给出明确的授权。

来自甲骨文:

“为了在模式中创建视图,该模式必须具有从视图所基于的所有表或视图中选择、插入、更新或删除行所需的权限。必须授予视图所有者这些权限直接,而不是通过角色。原因是授予角色的权限不能通过对象继承。

于 2009-04-09T22:16:36.760 回答
0

看起来导入有问题。所以我们的数据库管理员解决问题的方法是:

  • 删除有问题的表
  • 重新导入有问题的表的结构(列、约束、索引)
  • 重新创建结构后,他重新导入了数据
  • 他还使用 CREATE TABLE AS SELECT 来回复制数据

当他重新创建表结构时,他发现当前模式耗尽了可用空间(未设置为自动增长)。奇怪的是,第一次导入并没有抱怨空间不足。

所以理论上是空间不足是数据字典损坏的原因。

于 2009-04-14T18:24:50.707 回答