Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Триггер. Проблема с UPDATE  [new]
assassin94
Member

Откуда:
Сообщений: 9
Добрый день.
Написал триггер, который будет извлекать зашифрованные значения из временной таблицы TEMP_TABLE, которые были туда внесены с помощью другого триггера, сравнивать эти значения с реальными зашифрованными значениями из регулярной таблицы Table_1 и при совпадении заменять реальные значения из Table_1 на зашифрованные.
Атрибут Nom является Primary key для Table_1, его и необходимо шифровать и заменять при выполнении условия.
Если таблица TEMP_TABLE пустая, то триггер срабатывает. Если в ней уже есть что-то, то тогда значения не вставляются, возникает ошибка ORA-00001: unique constraint (constraint_name) violated.
Проблема в UPDATE, как я понимаю, тк пробовал не делать Nom первичным ключом, тогда строки вставляются, но все предыдущие значения в колонке Nom становятся одинаковыми (такими же, как только что вставленное).
Как можно решить проблему замены старых значений на новые?

create or replace TRIGGER After_insert_trigger1
AFTER INSERT ON Table_1
DECLARE

CURSOR encvalCursor IS
SELECT enc_value
FROM Temp_Table, Table_1
WHERE Temp_Table.Number_= Table_1.N_zayav;
vEncryption_val TEMP_TABLE.ENC_VALUE %TYPE;

CURSOR enckeyCursor IS
SELECT enc_key
FROM Temp_Table, Table_1
WHERE Temp_Table.Number_= Table_1.N_zayav;
vEncryption_key TEMP_TABLE.ENC_KEY %TYPE;

CURSOR NomerCursor IS
SELECT Nom
FROM Table_1, Table_1_keys
WHERE Table_1.N_zayav=Table_1_keys.N_zayav1;
vIn_value Table_1. Nom %TYPE;

in_enc_val RAW (2000);
raw_in_val RAW (2000);
enc_algo NUMBER := dbms_crypto.ENCRYPT_AES128 + dbms_crypto.CHAIN_CBC + dbms_crypto.PAD_PKCS5;
BEGIN
OPEN encvalCursor;
     LOOP
     FETCH encvalCursor INTO vEncryption_val;
     EXIT WHEN 
          encvalCursor %NOTFOUND;
     END LOOP;
CLOSE encvalCursor;

OPEN enckeyCursor;
     LOOP
     FETCH enckeyCursor INTO vEncryption_key;
     EXIT WHEN 
          enckeyCursor %NOTFOUND;
     END LOOP;
CLOSE enckeyCursor;

OPEN NomerCursor;
     LOOP
     FETCH NomerCursor INTO vIn_value;
     EXIT WHEN 
          NomerCursor %NOTFOUND;
     END LOOP;
CLOSE NomerCursor;

raw_in_val := UTL_I18N.STRING_TO_RAW (vIn_value, 'AL32UTF8');
in_enc_val := DBMS_CRYPTO.encrypt (src => raw_in_val,
                                   KEY => vEncryption_key,
                                   typ => enc_algo
                                  );
IF vEncryption_val=in_enc_val
THEN
UPDATE Table_1
SET Nom = vEncryption_val
WHERE N_zayav IN (
SELECT Number_ FROM Temp_Table);
END IF;
END;

Заранее спасибо.
24 май 15, 17:31    [17682350]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Проблема с UPDATE  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1639
Изучите конструкцию exception.
24 май 15, 20:02    [17682724]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Проблема с UPDATE  [new]
assassin94
Member

Откуда:
Сообщений: 9
dmdmdm,

Изучил DUP_VAL_ON_INDEX. Но не знаю, как ее встроить в свой код. Потому что и те данные, что попадут в исключение, мне тоже надо добавить в таблицу.
24 май 15, 20:10    [17682737]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Проблема с UPDATE  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1639
те данные, что попадут в исключение, мне тоже надо добавить в таблицу.



В чем же проблема?

Может, test case какой сделаете? А в процессе его написания все сами и поймете?
24 май 15, 20:19    [17682760]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Проблема с UPDATE  [new]
assassin94
Member

Откуда:
Сообщений: 9
dmdmdm,

Я уже пробовал вставлять миллион строк, но как организовать исключение так и не дошло.
24 май 15, 20:26    [17682781]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Проблема с UPDATE  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1639
assassin94
Изучил DUP_VAL_ON_INDEX. Но не знаю, как ее встроить в свой код.


assassin94
организовать исключение так и не дошло.


Еще раз - сделайте test case;
Не надо стесняться пробелов в своих знаниях. Нежелание изучать, мол, "напишите мне готовое" - это серьезнее, чем незнание. Это здесь нигде не приветствуется.
24 май 15, 21:05    [17682862]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Проблема с UPDATE  [new]
assassin94
Member

Откуда:
Сообщений: 9
dmdmdm,

Да, пробелы в знаниях мешают, сейчас в этом хорошо убедился. Можете, пожалуйста, направить, в какую сторону двигаться? Полдня не сдвигаюсь с этой мертвой точки.
24 май 15, 21:11    [17682873]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Проблема с UPDATE  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1639
assassin94
направить, в какую сторону двигаться?


Повторяю - сделайте test case.
Покопайтесь с ним сами, выложите нам, все подскажем.
Главное - начать.
24 май 15, 21:32    [17682902]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить