插入自动增量触发后

时间:2016-12-20 20:24:03

标签: sql oracle arcgis

这里的问题是,我们使用一个名为ArcGIS的应用程序为我们的数据库创建一个上层管理层,当我们的用户使用ArcGIS在数据库中创建一个新对象时,它会向其中添加一个默认值(0)。主键,因此在创建第二个对象时,它会触发ORA错误以获得重复值。

所以我的想法是为我们的PK创建一个自动增量触发器,但是使用AFTER INSERT代替。 我在网上找不到任何关于这个特定情况的例子,只需将BEFORE切换到AFTER就会出现错误,说明你不能在事后使用NEW

我尝试的SQL代码(取自其他问题):

CREATE OR REPLACE TRIGGER  "IMOVEL_TRIGGER" 
  after insert on IMOVEL               
  for each row  
begin   
  select IMOVEL_SEQ.nextval into :NEW.GEOCODIGO_IMOVEL from dual; 
end; 

它不能是BEFORE INSERT触发器,因为应用程序会覆盖它

简化,我需要的是一个AFTER INSERT触发器,它将PK更新为序列.nextval,它不允许我使用:OLD或:NEW,所以我不确定必须做什么。 或者仅在创建后运行的更新触发器

这对我来说是一个非常新的领域,现在只需要学习SQL来解决这个问题

2 个答案:

答案 0 :(得分:1)

您只能在BEFORE触发器中更改vendor值。当你到达AFTER触发器时,该行已被插入,因此更改列为时已晚。

http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_7004.htm说:

  

对BEFORE触发器的限制

     

:NEW触发器受以下限制:

     
      
  • 您无法在视图或对象视图上指定BEFORE触发器。

  •   
  • 您可以写入BEFORE值,但不能写入:NEW值。

  •   
     

AFTER触发限制

     

:OLD触发器受以下限制:

     
      
  • 您无法在视图或对象视图上指定AFTER触发器。

  •   
  • 您无法写出AFTER:OLD值。

  •   

目前尚不清楚为什么要使用AFTER触发器为PK分配序列值。常见的解决方案是使用BEFORE触发器。

参见:How to create id with AUTO_INCREMENT on Oracle?

中的示例

答案 1 :(得分:0)

CREATE SEQUENCE IMOVEL_TRIGGER_SEQ START WITH 1;

触发器定义:

CREATE OR REPLACE TRIGGER IMOVEL_TRIGGER
BEFORE INSERT ON IMOVEL 
FOR EACH ROW

BEGIN
  SELECT IMOVEL_TRIGGER_SEQ.NEXTVAL
  INTO   :new.GEOCODIGO_IMOVEL 
  FROM   dual;
END;