【问题标题】:Privileges lost after dropping objects in Oracle在 Oracle 中删除对象后权限丢失
【发布时间】:2019-01-26 16:06:16
【问题描述】:

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

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

【问题讨论】:

  • 最好的解决方案是 - 不要丢弃对象。为什么需要丢弃对象?
  • 仍然,为什么需要重新创建它们?目的是什么?如果您需要清除数据,为什么“截断”还不够?因为我从删除和重新创建它们中看到的唯一目的是“强制清理”数据。不应随时删除/重新创建 DB 对象 - 这是一种不好的做法。
  • 对于 VIEW 和其他一些对象,您可以使用 CREATE OR REPLACE ... 语法。这样可以保留特权。
  • 你说的是什么对象?对于 TABLES 或 SNAPSHOTS,您应该使用 TRUNCATE,对于 VIEWS,您可以使用 CREATE OR REPLACE ...
  • 那你应该说服项目负责人改变这种愚蠢的要求。这样做的目的是什么?

标签: sql oracle schema privileges warehouse


【解决方案1】:

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

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

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

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

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

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


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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 2015-03-30
    • 1970-01-01
    • 2020-07-15
    • 2011-05-21
    • 1970-01-01
    相关资源
    最近更新 更多