【问题标题】:Insert Entry and Ignore Sequence插入条目并忽略序列
【发布时间】:2013-10-14 11:12:23
【问题描述】:

我有一个表,其中一个序列为每条记录添加了主 ID,现在第 3 条记录已被删除,我需要用 ID 3 将其重新插入,但由于该序列存在它不会让我这样做,谁能建议?我尝试插入时收到以下消息。

ORA-20001:表序号是内部提供的;请不要包含在插入 SQL 语句中

ORA-06512 位于:“owner.trigger_name”,第 4 行

ORA-04088: 执行触发器“owner.trigger_name”时出错

【问题讨论】:

    标签: oracle insert sequence


    【解决方案1】:

    ORA-20001 错误在用户定义的范围内,因此抱怨的是您自己的代码(或者无论如何是应用程序的代码) - 它不是 Oracle 本身。

    看起来分配 ID 的触发器正在执行完整性检查,并在发现在插入过程中手动提供了一个值时引发了该异常。大概是为了保护你自己,它会阻止你输入一个高于当前序列号的值——这会在序列达到相同值时导致错误。 (假设它是一个主键,或者至少有一个唯一的约束)。

    由于它来自您自己的应用程序代码,因此唯一的解决方法是识别并禁用从序列中分配 ID 值并引发异常的触发器。

    alter trigger <trigger_name> disable;
    

    ...然后当你完成时:

    alter trigger <trigger_name> enable;
    

    但我只会在中断期间或您至少可以保证此表上没有其他插入时才会这样做。禁用触发器时的任何插入都不会获得分配的 ID。他们也应该出错 - 再次假设它是主键或非空唯一键 - 但这仍然是不可取的。

    如果您真的无法阻止其他插入,您可以(暂时)重新创建触发器而不进行完整性检查,但即便如此,这也不是一件容易的事。

    当然,如果它是合成键,那么实际的键值应该无关紧要,在这种情况下,进行正常插入并为重新插入的行获取新的 ID 值应该没问题。如果某个其他表引用了3,那么听起来您没有外键约束,这会阻止该行首先被删除。

    【讨论】:

    • 谢谢,有道理,我会安排停机时间进行更改,再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2019-03-11
    • 2012-08-11
    • 2010-10-23
    • 2016-07-29
    • 2014-02-19
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多