Oracle DB, переместить строку при обновлении в другую таблицу

#oracle #triggers #move

#Oracle #триггеры #переместить

Вопрос:

вначале я думал, что это действительно легко выполнить, но я застрял с ошибкой изменения с помощью триггера, и у меня нет другой идеи о том, как это выполнить. основная цель этого действия — избежать того, чтобы строка обновления выполнялась дважды… поэтому, как только некоторые поля обновляются, мне нужен процесс, который перемещает строку в другую таблицу (те же поля в этой таблице)

Я пробовал запускать с помощью AFTER update.. но ошибка изменения

Я надеюсь, что кто-нибудь может мне помочь

заранее благодарю

Raph

Ответ №1:

Сложно отлаживать код, который вы не видите; почему вы не опубликовали тестовый пример, чтобы мы увидели, что вы сделали и как отреагировал Oracle?


Потому что это работает так, как ожидалось — если я правильно понял вопрос. Вот как.

 SQL> create table test (id number, name varchar2(20));

Table created.

SQL> create table test_2 (id number, name varchar2(20), datum date);

Table created.

SQL> create or replace trigger trg_ai_test
  2    after insert on test
  3    for each row
  4  begin
  5    insert into test_2 (id, name, datum)
  6      values (:new.id, :new.name, sysdate);
  7  end;
  8  /

Trigger created.
 

Тестирование:

 SQL> insert into test (id, name) values (1, 'Littlefoot');

1 row created.

SQL> select * from test;

        ID NAME
---------- --------------------
         1 Littlefoot

SQL> select * From test_2;

        ID NAME                 DATUM
---------- -------------------- -------------------
         1 Littlefoot           07.01.2021 13:47:31

SQL>
 

Я предполагаю, что ваш триггер выбирает из таблицы, в которой вы создали триггер (в моем примере это было бы select ... from test ). Вы не можете этого сделать из-за ошибки изменяющейся таблицы, но — вам также не нужно этого делать, поскольку вы можете использовать :new :old значения столбцов и / или.

Ответ №2:

именно это! изменение

Я нашел способ заставить ее работать :

создайте или замените ТРИГГЕР TRIGGER1 После ОБНОВЛЕНИЯ AUTOMATICCOUNT НА SCAN4000

НАЧАТЬ вставку в SCAN4000_SAP (datamatrixcode, automaticcount) выберите scan4000.datamatrixcode, scan4000.automaticcount из scan4000, где automaticcount не равен нулю; Удалить из SCAN4000, где scan4000.automaticcount не равен нулю; КОНЕЦ;

Коллега только что сказал мне, что это может привести к ВЗАИМОБЛОКИРОВКАМ, что вы думаете?