2016-12-20 74 views
1

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

所以我的想法是为我们的PK创建一个自动增量触发器,而是使用AFTER INSERT。 我找不到任何例子在线这个特定的情况下,简单地之前就切换到后给出了一个错误,说你不能用我的尝试后

SQL代码中使用NEW(来自其他问题采取的):

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,它不让我使用:旧的或新的,所以我不知道必须做什么。 或仅在创建后运行的更新触发

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

回答

1

只能在BEFORE触发器改变:NEW值。到达AFTER触发器时,该行已被插入,因此更改列已为时过晚。

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

限制触发

BEFORE触发器是受到以下限制:

  • 你不能在一个视图或指定BEFORE触发对象视图。

  • 您可以写入:NEW值,但不写入:OLD值。后

限制触发

AFTER触发器受到以下限制:

  • 不能指定一个视图或对象视图中AFTER触发。

  • 您无法编写:OLD:NEW值。

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

见例如:How to create id with AUTO_INCREMENT on Oracle?

+0

A之前触发将无法正常工作,我们正在使用的应用程序覆盖它 – Mojimi

+1

听起来像是一个ArcGIS的支持问题。我不知道ArcGIS,所以我无法帮助,对不起。 –

+0

是的,他们不认为它是一个错误,因为我们不应该手动在oracle中做任何事情,我只是想知道是否有办法绕过它 – Mojimi

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;