代码之家  ›  专栏  ›  技术社区  ›  friol

甲骨文特许权及副作用

  •  1
  • friol  · 技术社区  · 15 年前

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

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

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

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

    我的问题是:oracle为什么要锁定这个表(毕竟,我们并没有改变它的结构,只是给用户读取它的权限),为什么它需要使游标失效?

    有没有办法让这种行为变得更“温和”?

    提前谢谢。

    替代问题 :是否有方法知道特定表上打开了多少个游标,以便将无效性对该对象的影响降到最低?

    6 回复  |  直到 15 年前
        1
  •  2
  •   MJB    15 年前

    可能一次授予组权限,以后再授予用户成员权限,而不是直接表权限。我知道答案很简单,但我给人的印象是你知道你在做什么,而且能搞清楚细节。

        2
  •  2
  •   Adam Musch    15 年前

    基于授权消除失效:

    创建xxx_readonly角色,其中xxx是一些适当有意义的值,并授予该角色对所有适当表的select访问权,并在用户需要时向用户添加该角色。

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

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

        3
  •  1
  •   Doug McClean    15 年前

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

    很难理解为什么授予读权限会有类似的需求,可能只是实现的副作用。mjb的回答似乎是一个很好的解决方法(在很多情况下,这是一个很好的实践,简化了访问权限的管理)。

        4
  •  1
  •   Community Mohan Dere    8 年前

    对于第一个问题我无能为力,但作为替代,我发现了两个有用的命令 here here

        5
  •  0
  •   REW    15 年前

    mjb的groups是解决赠款问题的最佳方法,对于“触发器”问题,我建议将业务逻辑分离,以便它执行神奇的“触发器”所能执行的任何操作,特别是在2000万行以上的表上。

        6
  •  0
  •   Thomas Jones-Low    15 年前

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

    2)Oracle将在创建触发器时锁定表,因为触发器在安装时可以更改表。所有ddl都将锁定表,创建一个事务,以确切地知道何时可以触发(或其他更改)。我想这对助学金来说也是事实。

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

    我确信有一种方法可以使用oracle数据字典中的v$视图,找出针对给定表打开的游标。

    推荐文章