在Oracle中删除对象时保留权限
我突然想到我有一个关于特权的根本问题。。任何被授予访问我的数据仓库权限的人都将被授予报告架构中对象的权限。但是,每当我们丢弃对象时,这些特权就会丢失 该方法应满足的基本要求是:在Oracle中删除对象时保留权限,oracle,ddl,privileges,grant,Oracle,Ddl,Privileges,Grant,我突然想到我有一个关于特权的根本问题。。任何被授予访问我的数据仓库权限的人都将被授予报告架构中对象的权限。但是,每当我们丢弃对象时,这些特权就会丢失 该方法应满足的基本要求是: 加载数据期间未填充索引(已删除、禁用?),以避免插入时填充 保留现有特权 基于上述要求,你们认为最好的方法是什么?如果你扔掉一个对象,补助金就没有了。然而: 这里有一个常见的方法。还有其他的。如果有分区,有更好的方法 ALTER INDEX my_index1 UNUSABLE; ALTER INDEX my_index
基于上述要求,你们认为最好的方法是什么?如果你扔掉一个对象,补助金就没有了。然而: 这里有一个常见的方法。还有其他的。如果有分区,有更好的方法
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;
如果您
删除对象
,则授予将不复存在。然而:
这里有一个常见的方法。还有其他的。如果有分区,有更好的方法
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;
对于要求1:根据您正在运行的Oracle版本,您可以将索引更改为不可见。使索引不可见将导致优化器忽略它们,但这很方便,因为您可以在执行任何操作后使它们再次可见。如果这不起作用,你可以改为不可用。更多信息请点击此处: 对于需求2:一旦对象被删除,特权也随之被删除。当对象被删除时,实际上没有任何直接的方法来保持授权,但是,当表被删除时,您可以使用许多不同的方法来“保存”特权。这些只是一些让你继续前进的想法,而不是一种保证成功的方法
- 方法1:使用触发器和DBMS_调度程序发布授权。触发器功能非常强大,如果您创建的触发器设置为在特定模式下创建具有特定名称的表时运行,则可以使用DBMS_调度程序运行一个将发出丢失授权的作业
- 方法2:根据Littlefoot的建议,您可以将grant语句保存在SQL脚本中,并在每次创建表时手动运行(或为其创建触发器!)
- 方法3:处理业务并实现一个流程,其中不需要删除表,而是根据业务需要修改表。要使用此方法,您首先必须理解为什么要删除对象。为了达到预期的结果,真的需要一滴吗?我见过一些团队在真正希望表被截断时要求删除表。如果这是其中一种情况,则截断而不是删除将使对象及其授权保持不变
在任何情况下,您都需要确保尽可能通过角色管理权限,而不是向单个用户/模式授予权限。在任何情况下,利用角色都会使权限管理变得更加容易 对于要求1:根据您正在运行的Oracle版本,您可以将索引更改为不可见。使索引不可见将导致优化器忽略它们,但这很方便,因为您可以在执行任何操作后使它们再次可见。如果这不起作用,你可以改为不可用。更多信息请点击此处: 对于需求2:一旦对象被删除,特权也随之被删除。当对象被删除时,实际上没有任何直接的方法来保持授权,但是,当表被删除时,您可以使用许多不同的方法来“保存”特权。这些只是一些让你继续前进的想法,而不是一种保证成功的方法
- 方法1:使用触发器和DBMS_调度程序发布授权。触发器功能非常强大,如果您创建的触发器设置为在特定模式下创建具有特定名称的表时运行,则可以使用DBMS_调度程序运行一个将发出丢失授权的作业
- 方法2:根据Littlefoot的建议,您可以将grant语句保存在SQL脚本中,并在每次创建表时手动运行(或为其创建触发器!)
- 方法3:处理业务并实现一个流程,其中不需要删除表,而是根据业务需要修改表。要使用此方法,您首先必须理解为什么要删除对象。为了达到预期的结果,真的需要一滴吗?我见过一些团队在真正希望表被截断时要求删除表。如果这是其中一种情况,则截断而不是删除将使对象及其授权保持不变
在任何情况下,您都需要确保尽可能通过角色管理权限,而不是向单个用户/模式授予权限。在任何情况下,利用角色都会使权限管理变得更加容易 或者,将所有GRANT语句保留在一个.SQL文件中。一旦一切都创建好就运行它。@LukaszSzozda怎么做?你能举个例子吗?你明白你在说什么吗?你有一张桌子。你把那张桌子上的选择权授予了我。然后你放下桌子。甲骨文应该如何&为什么要保留关于你曾经在一个掉落的物体上授予我任何东西的信息?这根本没有意义。你有一个删除所有表并重新创建它们的过程吗?这不应该是任何业务流程的一部分,即使是这样,程序也应该通过重新申请任何补助金来完成工作。或者,如果这是生成过程的一部分,则该过程应管理grants.alter over drop-recreate。或者,将所有GRANT语句保留在单个.SQL文件中。继续