首页 > 解决方案 > 在 Oracle 中删除对象后权限丢失

问题描述

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

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

标签: sqloracleschemaprivilegeswarehouse

解决方案


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

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

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

最好的解决方案是不要丢弃对象。不断删除和重新创建对象,尤其是表,是不好的做法。无需在实时环境中执行此操作。这种做法认为它正在解决的问题可以使用正确的命令TRUNCATE或适当的数据结构GLOBAL TEMPORARY TABLE来更好地解决。

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

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


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


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


推荐阅读