【问题标题】:Can I Delete entire table without undo in Oracle?我可以在 Oracle 中删除整个表而不撤消吗?
【发布时间】:2021-03-25 21:54:33
【问题描述】:

我有一张桌子直到最近都很好用。我有一个与这个表交互的程序,步骤是......

  1. 删除所有记录
  2. 加载所有记录

最近记录的数量似乎开始使我们的 SQL 实例超载,当我尝试运行删除命令时,我得到......

ORA-30036: unable to extend segment by 128 in undo tablespace 'name'

我尝试使用 truncate 但我没有权限。有没有办法可以在没有撤消表空间的情况下删除?这适用于 SQL 开发人员,但我也希望它与 JDBC 连接一起使用。

【问题讨论】:

  • 什么意思,“你没有权限”(截断它)?你拥有这张桌子吗?因为,截断会重置高水位线。
  • 你想通过删除每一行然后插入它们来实现什么?您是否只是从其他地方刷新数据 - 然后使用合并语句,以便仅进行所需的修改,并且仅为此生成撤消/重做。如果正在查询您的表,则截断是等待发生的逻辑损坏 - 您的用户不希望 Schrödinger 的表有时会被填充,有时不会。
  • 这是一个有效的评论@AndrewSayer,但您还应该提到merge 性能较差更复杂更容易出错并且需要主键。因此,如果 mantainace 窗口 是可能的,truncate - insert 选项显然是首选。
  • @AndrewSayer 这取决于任务。这可能是 ETL 过程的某个阶段,因此无需合并某些内容。在加载速度和可用性之间有一个选择,有时用户可能会在 30 秒后重试。

标签: oracle


【解决方案1】:

基本上,您是在尝试模拟DELETEstatement 中TRANCATE TABLE 的功能。

所以你应该明确使用 TRUNCATE TABLE,因为它产生的UNDO 少得多,而且它还释放了MINEXTENTS 使用的空间。

如果该表不在访问用户架构中,您将需要权限DROP ANY TABLE,这可能是接收问题。

一个简单的解决方法是在执行(立即)TRUNCATE 的表的架构中定义一个存储过程,并且只请求该过程的EXECUTE 授权。

【讨论】:

  • 包装在存储过程中对我有用
猜你喜欢
  • 2023-03-26
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
  • 2011-09-10
  • 2013-03-06
  • 2017-01-30
  • 1970-01-01
相关资源
最近更新 更多