【问题标题】:ORACLE :Are grants removed when an object is dropped?ORACLE:删除对象时是否删除了授权?
【发布时间】:2010-02-14 21:53:16
【问题描述】:

我目前有 2 个架构,A 和 B。

B 有一个表,A 对其执行选择插入和更新。

在我们的 sql 脚本中,我们已授予 A 权限,以便它可以完成其任务。

grant select on B.thetable to A
etc,etc

现在,表 'thetable' 被删除,并且每天至少一次将另一个表重命名为 B。

rename someothertable to thetable

执行此操作后,当 A 在 B.thetable 上执行选择时,我们会收到错误。

ORA-00942: table or view does not exist

是否有可能在执行 drop + rename 操作后,授权也会丢失?

我们必须再次分配权限吗?

更新

someothertable 没有授权。

更新2

将数据插入“thetable”的日常流程每 N 次插入执行一次提交,因此无法执行任何回滚。这就是我们使用 2 个表的原因。

提前致谢

【问题讨论】:

  • 如果您的日常处理涉及删除和重新创建表,那么您做错了。
  • @Jeffrey Kemp:我明白了。您认为@Peter Lang 的替代方案是否可行?就个人而言,我认为这是一个好主意,但我自己不是一个数据库人。
  • 如果您使用的是现有解决方案(即,如果您只需要忍受删除和重新创建表),那么可以。

标签: oracle rename sql-grant ora-00942 sql-drop


【解决方案1】:

是的,一旦您删除表,授权也会被删除。

您可以尝试创建一个VIEW,从thetable 中选择并授予SELECT

不过,我觉得你定期丢桌的策略听起来不太对劲。为什么必须这样做?

编辑

有比每天丢桌子更好的方法。

  1. thetable 添加另一列,说明该行是否有效。

  2. 在该列上放置一个索引(或扩展您用于从该表中选择的现有索引)。

  3. 向您的查询添加另一个条件以仅考虑“有效”行或创建一个视图来处理它。

  4. 导入数据时,将新行设置为“新”。导入完成后,您可以在单个事务中删除所有“有效”行并将“新”行设置为“有效”。

如果导入失败,您可以回滚您的事务。

【讨论】:

  • 好吧,我有一个将信息插入表'thetabletmp'的过程,如果该过程结束正常,则将此信息传递给'thetable'(通过删除'thetable'并重命名'thetabletmp '到'桌子')。如果它没有结束 OK,那么 'thetabletmp' 将被删除,并且 'thetable' 包含最后一次有效运行。
  • 既然听起来你的进程是全有或全无,为什么不直接处理到“thetable”中,并酌情提交或回滚?或者,如果使用分区,请考虑使用 EXCHANGE PARTITION 功能,该功能旨在交换表中的数据。
  • @Peter Lang:无法应用“有效列”策略。该过程提交每 N 次插入,因此任何回滚都是部分的。
  • @Tom:这个策略在没有回滚的情况下也有效。当您知道插入失败并且确实想保留旧记录时,只需删除所有“新”记录而不是“有效”记录。
  • @Peter Lang:我明白了,我只是担心删除时间太长(可能大约 20 M 条记录或更多)
【解决方案2】:

也许重命名表的过程也应该执行一个为你授权的过程?您甚至可以花哨并在字典中查询现有授权并将其应用于重命名的表。

【讨论】:

    【解决方案3】:

    没有: “Oracle 数据库自动将旧对象的完整性约束、索引和授权转移到新对象。” http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_9019.htm#SQLRF01608

    你一定有其他问题

    【讨论】:

    • 如果来自someothertableSELECT 被授予,那将适用,但据我了解这个问题,这是一个新表。只有thetable 获得了资助,但被放弃了。
    • 没错,someothertable 没有授权。
    • 好吧,误会了。事实上,Grants 是基于对象的而不是基于名称的,视图策略是好的;)
    【解决方案4】:

    另一种方法是使用临时表来处理您正在做的工作。毕竟,这听起来只是数据是暂时的,至少在那个表中,而且你不必在每次有一组新数据/创建新表时都重新申请授权

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 2023-02-14
      • 1970-01-01
      相关资源
      最近更新 更多