sql - 在 Oracle 中删除对象后权限丢失
问题描述
我有一个数据仓库,其中包含用于报告的特定模式。任何被授予访问权限的人都将获得该架构中对象的权限。但是,每当我删除对象时,这些权限就会丢失。
保留现有特权的此类问题的最佳解决方案是什么?
解决方案
当我们授予对其他模式的访问权限时删除一个对象是非常有问题的。无论删除表和重新授予权限之间的间隔有多小,在一段时间内其他用户都会遇到查询失败或依赖对象无效的情况。避免这种情况发生的唯一方法是使数据库脱机。这可能会给更多人带来不便,所以我们可能不想这样做。
(即使我们的模式是使用删除表的唯一模式,这也是一个问题,但通常我们对此有更多的控制权。)
保留现有特权的此类问题的最佳解决方案是什么?
最好的解决方案是不要丢弃对象。不断删除和重新创建对象,尤其是表,是不好的做法。无需在实时环境中执行此操作。这种做法认为它正在解决的问题可以使用正确的命令TRUNCATE或适当的数据结构GLOBAL TEMPORARY TABLE来更好地解决。
但是,您似乎发现自己在一个坚持这种不良做法的正确性的顽固项目中。因此,您必须删除并重新创建表,然后您需要重新授予这些表的用户权限**(*)**。这应该很简单:创建表的脚本——你应该在这个练习中引用它——还应该包含授予必要权限的语句。
当然,这假定您的项目遵循有关 DDL 脚本的源代码控制的良好做法。在这种情况下,我的希望并不高。
当然,在某些情况下删除并重新创建表是一种合理的解决方案。例如,当为分区交换操作准备大量数据时,drop-and-recreate 可能比 truncate-and-insert 更有效。但是这样的用例是小众用例,通常与授予其他模式的权限无关。
(*) 需要这样做是删除表是不好的做法的原因之一。
推荐阅读
- flutter - Flutter:如何在 statelesswidget 中调用函数?
- spring-boot - 如何从 Flyway 脚本在 Marklogic 中创建或验证 ElementRangeIndexes
- matrix - 使用包含字符串的列表初始化矩阵
- flutter - Flutter - 子小部件未在 tabBarView 中重建
- python - Python时间输出在变量前面有单引号
- android - Android 联系人跟踪 API 文档
- javascript - ie11内存泄漏的所有可能原因是什么?
- spring-boot - 使用 jdbc_ping 使用 JMS、Artemis 和 JGroups 设置 spring-boot 应用程序
- javascript - 在搜索框中搜索时如何过滤 div?
- python - 如何在Python中基于多个列和条件执行组函数