在Oracle中删除对象后丢失的特权

时间:2018-08-20 13:51:04

标签: sql oracle schema privileges warehouse

我有一个数据仓库,其中包含用于报告的特定架构。被授予访问权限的任何人都将被授予对该架构中的对象的特权。但是,每当我放下对象时,这些特权都会丢失。

对于此类问题,保留现有特权的最佳解决方案是什么?

1 个答案:

答案 0 :(得分:2)

当我们授予对象对其他模式的访问权限时,将其拖放非常困难。无论在删除表和重新授予特权之间的窗口有多小,在一段时间内,其他用户都会使查询失败或从属对象失效。避免这种情况的唯一方法是使数据库脱机。这可能给更多的人带来不便,因此我们可能不想这样做。

(即使我们的模式是使用删除表的唯一模式,这也是一个问题,但是通常我们对此有更多的控制权。)

  

对于此类问题,保留现有特权的最佳解决方案是什么?

最好的解决方案是不要掉落物体。连续删除和重新创建对象(尤其是表)是一种不好的做法。无需在现场环境中执行此操作。这种做法认为可以解决的问题可以使用正确的命令TRUNCATE或适当的数据结构GLOBAL TEMPORARY TABLE来更好地解决。

但是,您似乎发现自己参与了一个顽固的项目,该项目坚持这种不良做法的正确性。因此,您必须删除并重新创建表,然后需要向这些表的用户重新授予特权**(*)**。这应该非常简单:创建表的脚本(在本练习中应参考该脚本)还应包含用于授予必要特权的语句。

当然,这假定您的项目遵循有关DDL脚本的源代码控制的良好实践。在这种情况下,我的希望不高。


当然,在某些情况下,删除并重新创建表是一种合理的解决方案。例如,在为分区交换操作准备大量数据时,删除和重新创建可能比截断并插入更有效。但是,这些用例是小众的用例,通常与授予其他模式的特权无关。


(*)这样做是删除表是不好的做法的原因之一。