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

Privileges lost after dropping objects in Oracle

我有一个包含特定报告模式的数据仓库。任何被授予访问权限的人都将被授予对该模式中对象的特权。但是,每当我删除对象时,这些特权就会丢失。

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

当我们已授予其他模式访问权限时删除对象是非常有问题的。无论删除 table 和重新授予权限之间的 window 有多小,其他用户都会有一段时间查询失败或依赖对象无效。避免这种情况发生的唯一方法是使数据库脱机。这可能会给更多人带来不便,所以我们可能不想这样做。

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

What are the best solutions for such issue to retain existing privileges?

最好的解决办法是不要丢弃对象。不断删除和重新创建对象,尤其是 tables,是不好的做法。无需在实时环境中执行此操作。这个实践认为它正在解决的问题可以用正确的命令 TRUNCATE, or the appropriate data structure, GLOBAL TEMPORARY TABLE 更好地解决。

但是,您似乎发现自己在一个固执己见的项目中,坚持认为这种不良做法是正确的。所以你必须删除并重新创建 tables,然后你需要重新授予那些 tables**(*)** 的用户权限。这应该很简单:创建 table 的脚本——你应该在本练习中引用它——还应该包含授予必要权限的语句。

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


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


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