2017-01-25 3 views
0

У меня есть таблица в Oracle 12c, который реализует последовательность для увеличения идентификаторов на вставках:Oracle ID триггера вставка с ID, который уже принял

CREATE SEQUENCE 
"ORCL_WD"."BIR_GRIDBASE_ID_SEQ" 
MINVALUE 1 MAXVALUE 999999999999999999999999 
INCREMENT BY 1 START WITH 61 CACHE 20 NOORDER NOCYCLE NOPARTITION ; 

и триггер для этого:

create or replace trigger BIR_GRIDBASE_TRIG 
    before insert on "ORCL_WD"."BIR_GRIDBASE" 
    for each row 
begin 
    if inserting then 
     if :NEW."ID" is null then 
     select BIR_GRIDBASE_ID_SEQ.nextval into :NEW."ID" from dual; 
     end if; 
    end if; 
end; 

Этих последовательность работает, но у меня есть некоторые пробелы в моих идентификационных полях, поэтому при вставке новых элементов в эту таблицу идентификаторы дубликатов вставки.

Как предотвратить это?

+0

Включает ли триггер вставку повторяющихся значений или проблема в том, что триггер генерирует пробелы? – Aleksej

+0

'if: NEW.« Идентификатор »имеет значение null, затем' - если его не 'NULL', то он не будет использовать значение последовательности и будет просто вставлять любое значение, предложенное пользователем, - последовательность не будет знать, что это значение было используется и будет просто пытаться использовать следующее значение в последовательности. – MT0

+0

Вам не нужно заглядывать в область SQL, чтобы получить следующее значение последовательности. Вы могли бы просто сделать: ': NEW.ID: = BIR_GRIDBASE_ID_SEQ.nextval;' – MT0

ответ

0
  1. Проверьте последнее значение ID в таблице
  2. Проверьте ваш статус ПОСЛЕДОВАТЕЛЬНОСТЬ

    SELECT COUNT(*) 
    FROM user_sequences 
    WHERE sequence_name = 'BIR_GRIDBASE_ID_SEQ'; 
    

Может быть, вы добавите значение для этой таблицы без сходящейся последовательности и теперь у вас есть дубликат

0

You включить строку:

if :NEW."ID" is null then 

Это означает, что если ID пользователь попытался вставить не NULL, он просто продолжит использовать предложенное пользователем значение ID, а не значение последовательности.

Самый простой способ решить эту проблему, чтобы не использовать триггер и просто включить значение последовательности в вставке:

INSERT INTO ORCL_WD.BIR_GRIDBASE (
    ID, 
    COLUMN_A, 
    COLUMN_B 
) VALUES (
    ORCL_WD.BIR_GRIDBASE_ID_SEQ, 
    'Value A', 
    'Value B' 
); 

Затем пользователь не может предложить значения идентификаторов и значение идентификатора всегда будет определенное значение ,

Если вы полагаетесь на использование триггера, вам следует взглянуть на то, нужно ли разрешать пользователю предлагать значения идентификатора, и если это так, вам придется защищать код, чтобы предотвратить появление этих дубликатов (т. Е. пропустите некоторые значения последовательности). Если это не так, то вы можете просто удалить if :NEW."ID" is null then заявление, как это:

create or replace trigger BIR_GRIDBASE_TRIG 
    before insert on "ORCL_WD"."BIR_GRIDBASE" 
    for each row 
begin 
    :NEW.ID := BIR_GRIDBASE_ID_SEQ.nextval; 
end; 
/

и все значения ID будет поступать из последовательности.

+0

Значение идентификатора равно null при прохождении через вставку – Azarix