2016-12-20 1 views
1

Le problème est que nous utilisons une application appelée ArcGIS qui crée une couche de gestion supérieure pour notre base de données, et lorsque nos utilisateurs utilisent ArcGIS pour créer un nouvel objet dans la base de données, elle ajoute une valeur par défaut (0) à la clé primaire, donc lorsque le deuxième objet est créé, il déclenche une erreur ORA pour avoir des valeurs en double. Donc, mon idée était de créer un déclencheur d'incrémentation automatique pour notre PK, mais j'utilise AFTER INSERT à la place. Je ne pouvais pas trouver un exemple en ligne pour ce cas précis et un simple passage BEFORE donne après une erreur en disant que vous ne pouvez pas utiliser NOUVEAU avec APRÈSAprès le déclenchement automatique de l'incrément d'insertion

code SQL de ce que j'ai essayé (pris d'autres questions):

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; 

il ne peut pas être un élément déclencheur BEFORE INSERT, car l'application écrase

Simplifier, ce que je besoin est un déclencheur AFTER INSERT, qui met à jour le PK à la séquence .nextval, il n'a pas laissez-moi utiliser: VIEUX ou: NOUVEAU, donc je ne suis pas sûr de ce qui doit être fait. Ou un déclencheur de mise à jour qui fonctionne uniquement après sa création

C'est assez nouveau pour moi, avoir à apprendre SQL maintenant juste pour résoudre ce problème

Répondre

1

Vous pouvez modifier :NEW uniquement les valeurs dans un déclencheur AVANT. Au moment où vous atteignez le déclencheur AFTER, la ligne a déjà été insérée, il est donc trop tard pour changer les colonnes.

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

Restrictions sur les triggers BEFORE

BEFORE déclencheurs sont soumis aux restrictions suivantes:

  • Vous ne pouvez pas spécifier un déclencheur BEFORE sur une vue ou un vue d'objet. Vous pouvez écrire à la valeur :NEW mais pas à la valeur :OLD.

Restrictions sur les triggers AFTER

AFTER déclencheurs sont soumis aux restrictions suivantes:

  • Vous ne pouvez pas spécifier un AFTER déclencheur sur une vue ou une vue de l'objet. Vous ne pouvez pas écrire la valeur :OLD ou :NEW.

On ne sait pas pourquoi vous voulez utiliser un déclencheur AFTER pour attribuer des valeurs de séquence au PK. La solution commune consiste à utiliser un déclencheur BEFORE.

Voir exemple: How to create id with AUTO_INCREMENT on Oracle?

+0

Un déclencheur avant ne fonctionnera pas, l'application que nous utilisons écrase – Mojimi

+1

Sonne comme un problème de soutien pour ArcGIS. Je ne connais pas ArcGIS donc je ne peux pas aider avec ça, désolé. –

+0

Ouais, ils ne le considèrent pas comme un bug puisque nous ne sommes pas supposés faire quoi que ce soit en oracle, je me demandais juste s'il y avait un moyen de le contourner – Mojimi

0
CREATE SEQUENCE IMOVEL_TRIGGER_SEQ START WITH 1; 

définition Trigger:

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;