【问题标题】:Retain privileges when dropping objects in Oracle在 Oracle 中删除对象时保留特权
【发布时间】:2018-08-21 18:55:40
【问题描述】:

我突然想到,我有一个关于权限的基本问题。任何被授予访问我的数据仓库的权限的人都将获得报告架构中对象的权限。但是,每当我们删除对象时,这些权限就会丢失。

该方法应满足的基本要求是:

  1. 在加载数据期间未填充索引(已删除、禁用?)以避免在插入时填充
  2. 保留现有权限。

根据上述要求,你们认为最好的方法是什么?

【问题讨论】:

  • 改变 drop-recreate。
  • 或者,将所有 GRANT 语句保存在单个 .SQL 文件中。创建所有内容后运行它。
  • @LukaszSzozda 怎么做?你能举个例子吗?
  • 你明白你在说什么吗?你有一张桌子。您在该表上授予我 SELECT 权限。然后你放下桌子。 Oracle 应该如何以及为什么要保留有关您曾在 dropped object 上授予我任何东西这一事实的信息?这没有任何意义。
  • 您有一个删除所有表并重新创建它们的过程?这不应该是任何业务流程的一部分,即使是,该程序肯定应该通过重新申请任何授权来完成工作。或者,如果这是构建过程的一部分,则该过程应该管理授权。

标签: oracle ddl privileges sql-grant


【解决方案1】:

对于要求 1:根据您运行的 Oracle 版本,您可以将索引更改为不可见。使索引不可见将导致优化器忽略它们,但它可以派上用场,因为您可以在执行任何操作后简单地使它们再次可见。如果这不起作用,您可以将它们更改为不可用。更多信息在这里:https://oracle-base.com/articles/11g/invisible-indexes-11gr1

对于要求 2:一旦对象被删除,权限也会随之删除。当对象被删除时,没有任何直接的方法来保留授予原样,但是,您可以使用多种不同的方法来“保存”权限一个表被删除。这些只是一些让你前进的想法,而不是保证成功的方法。

  • 方法 1:使用触发器和 DBMS_SCHEDULER 发出授权。触发器可能非常强大,如果您创建的触发器设置为在特定模式下创建特定名称的表时运行,则可以使用 DBMS_SCHEDULER 运行将发出丢失授权的作业。

  • 方法 2:根据 Littlefoot 的建议,您可以将授权语句保存在 SQL 脚本中,并在每次创建表时手动运行(或为其创建触发器!)

  • 方法 3:与业务合作并实施一个流程,其中不需要删除表,而是根据业务需求进行更改。要使用此方法,您必须首先了解对象被丢弃的原因。真的需要一滴来达到预期的结果吗?我见过团队在他们真的只是希望截断表时要求删除表。如果这是其中一种情况,截断而不是删除将使您保持对象及其授权完好无损。

在任何情况下,您还需要确保尽可能通过角色管理权限,而不是向单个用户/架构颁发授权。使用角色将使管理权限在几乎任何情况下都变得更加容易。

【讨论】:

    【解决方案2】:

    如果你DROP 一个对象,授权就消失了。然而:

    Indexes not populated during load of data (dropped, disabled?) to avoid
        populating while inserting
    Retain existing privileges.
    

    这是一种常见的方法。还有其他的。如果你有分区有更好的方法。

    ALTER INDEX my_index1 UNUSABLE;
    ALTER INDEX my_index2 UNUSABLE;
    ...
    ALTER INDEX my_indexn UNUSABLE;
    TRUNCATE TABLE my_table_with_n_indexes;  -- OPTIONAL (depends if you need to start empty)
    INSERT /*+ APPEND */ INTO my_table_with_n_indexes;  -- Do your load here.  APPEND hint optional, depending on what you are doing
    ALTER INDEX my_index1 REBUILD;
    ALTER INDEX my_index2 REBUILD;
    ...
    ALTER INDEX my_indexn REBUILD;  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-26
      • 1970-01-01
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多