我有一个表,其中一个序列为每个记录添加了主要ID,现在删除了记录号3,我需要将其插入ID为3,但因为序列存在它不会让我,任何人都可以建议?我尝试插入时收到以下消息。
ORA-20001:表序列号在内部提供;请不要包含插入SQL语句
ORA-06512 at:“owner.trigger_name”,第4行
ORA-04088:执行触发器'owner.trigger_name'
时出错
答案 0 :(得分:4)
ORA-20001
错误在用户定义的范围内,因此它是您自己的代码(或者应用程序的代码),它正在抱怨 - 它本身不是Oracle。
看起来分配ID的触发器正在进行健全性检查,并在看到插入期间手动提供了值时引发该异常。这可能是为了保护您自己,并且它会阻止您输入一个高于当前序列号的值 - 这会在序列达到相同值时导致错误。 (假设它是主键,或者至少有一个唯一约束)。
由于它来自您自己的应用程序代码,因此唯一的方法是识别和禁用从序列中分配ID值并抛出异常的触发器。
alter trigger <trigger_name> disable;
......然后当你完成时:
alter trigger <trigger_name> enable;
但是我只会在停电期间执行此操作,或者至少可以保证此表中没有其他插件。禁用触发器时的任何插入都不会分配ID。它们也应该出错 - 再次假设它是主键或非空的唯一键 - 但这仍然是不可取的。
如果你真的无法阻止其他插入,你可以(暂时)重新创建触发器而不进行健全性检查,但即便如此,这也不是轻易做到的。
当然,如果它是一个合成密钥,那么实际的密钥值应该无关紧要,在这种情况下,它应该很好地进行正常插入并为重新插入的行获取新的ID值。如果某个其他表具有对3
的引用,则听起来您没有外键约束,这会阻止该行首先被删除。