1

每天在大型 Oracle 生产数据库(10g)上工作,我们注意到像这样的操作

  • 授予用户对表的读取权限
  • 在表上创建触发器

锁定该表,并使所有坚持使用它的游标无效。

如果表很大(> 2000 万行)并且许多用户正在处理它,这会产生巨大的后果。

我的问题是:为什么 Oracle 会锁定表(毕竟我们并没有改变它的结构,而只是授予用户读取它的权限)以及为什么它需要使游标无效?

有没有办法让那些动作“更柔和”?

提前致谢。

替代问题:有没有办法知道在特定表上打开了多少游标,以尽量减少失效对该对象的影响?

4

6 回答 6

2

消除基于授权的失效:

创建 xxx_READONLY 角色,其中 xxx 是一些适当有意义的值,并授予角色对所有适当表的选择访问权限,并在用户需要时将角色添加给用户。

基于触发器创建消除 DDL 锁:

上次我真正检查时,触发器是解释代码,而过程和包是编译代码。因此,在触发器中执行复杂的逻辑通常是不受欢迎的。可以在触发器中调用过程或包方法,并且将触发器逻辑封装在过程/包中可以减轻或消除针对基表的 DDL 锁。

于 2010-06-28T18:49:28.720 回答
2

也许一次授予组权限,然后在将来授予用户成员权限,而不是直接表权限。我知道非常简单的答案,但我的印象是你知道你在做什么并且可以弄清楚细节。

于 2010-06-17T19:17:59.297 回答
1

对第一个问题无能为力,但对于替代方案,我在这里这里找到了几个有用的命令

于 2010-06-28T18:15:15.873 回答
1

我可以看到添加触发器如何需要锁定并且使游标无效或等待所有打开的游标关闭,至少如果游标可能用于需要执行新触发器的操作。

很难看出授予读取权限会有类似要求的原因,可能只是实现的副作用。MJB 的回答似乎是解决这个问题的一种不错的方法(在很多情况下,无论如何都是一种很好的做法,简化了访问权限的管理)。

于 2010-06-22T18:06:00.650 回答
0

1)我的问题是授予对表的读取访问权限,为什么要直接授予对表的读取权限而不是创建角色,授予对表的角色读取权限,然后将角色授予(或删除)用户?这将消除授权的锁定表问题。

2) Oracle 将在创建触发器时锁定表,因为触发器可以在安装时更改表。所有 DDL 都会锁定表,创建一个事务,以准确知道它何时可以参与触发器(或其他更改)。我怀疑赠款也是如此。

如果您不断地从表中添加/删除触发器,我会从触发器中删除您正在更改的代码并将其放入单独的 PL/SQL 过程中。然后根据需要更新程序。这将导致触发器失效(并需要重新编译),这是自动完成的。

我确信有一种方法可以使用 Oracle 数据字典中的 v$ 视图来确定针对给定表打开了哪些游标。

于 2010-06-28T18:09:40.320 回答
0

来自 MJB 的小组事情将是解决授权问题的最佳解决方案,对于“触发”问题,我建议分离业务逻辑,以便它执行神奇的“触发”会做的任何事情,尤其是在 20 百万行表上.

于 2010-06-27T00:57:53.553 回答