在Oracle中删除对象时保留特权

时间:2018-08-21 18:55:41

标签: oracle ddl privileges grant

在我看来,我在特权方面存在一个基本问题。任何被授予对我的数据仓库访问权限的人都将被授予对报告架构中对象的特权。但是,每当我们放下对象时,这些特权就会丢失。

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

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

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

2 个答案:

答案 0 :(得分:3)

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

对于要求2:删除对象后,特权也随之删除。放置对象时,实际上并没有任何直接的方法来保留授予 ,但是,当出现以下情况时,可以使用多种不同的方法“保存”特权一张桌子掉了。这些只是使您前进的一些想法,而不是保证成功的方法。

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

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

  • 方法3:与业务部门合作并实施一个流程,其中不需要删除表,而是对其进行了更改以适应业务需求。要使用此方法,您必须了解为什么首先要删除对象。为了达到预期的结果,是否真的需要滴水?我已经看到团队在他们确实只希望表被截断时要求删除表。如果这是其中的一种情况,则可以通过截断而不是删除来使对象及其授权保持完整。

在任何情况下,您还都想确保自己尽可能地通过角色来管理权限,而不是向单个用户/方案颁发许可。在几乎所有情况下,利用角色都将使权限管理变得更加容易。

答案 1 :(得分:0)

如果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;