Как обновить таблицу с помощью триггера

Я пытаюсь создать триггер, который читает из таблицы 2 и обновляет столбец в таблице 1. Я пытался использовать этот метод, но произошло исключение: ORA-04091: таблица table1 мутирует.

CREATE OR REPLACE TRIGGER "TRG1"
AFTER INSERT OR UPDATE ON table1
FOR EACH ROW
 BEGIN
 UPDATE table1 SET name =(SELECT name FROM table2
WHERE table1.id = table2.id);
 END;

Почему вы дублируете данные по таблицам? Если имя в table2 обновлено, то данные в table1 будут устаревшими — по крайней мере, до тех пор, пока они не будут обновлены по какой-либо другой причине.

Alex Poole 16.11.2022 18:26
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
2
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете обновить имя только в триггере перед

CREATE OR REPLACE TRIGGER "TRG1"
BEFORE INSERT OR UPDATE ON table1
FOR EACH ROW
  DECLARE new_name varchar2(100);
 BEGIN
   
  
       SELECT name INTO new_name FROM table2
        WHERE :new.id = table2.id;
     :new.name :=new_name;   
 END;
/

МТО было так приятно сделать скрипку

Синтаксис в триггере недействителен, поскольку присваивание равно :=, и вы не можете использовать оператор SELECT в PL/SQL без предложения INTOfiddle.

MT0 16.11.2022 17:41

спасибо я исправил свою ошибку

nbk 16.11.2022 18:09

@nbk Я искренне ценю вашу помощь.

adem daradour 18.11.2022 17:04
Ответ принят как подходящий

Используйте триггер BEFORE UPDATE (поскольку вы не можете изменять значения после того, как они были вставлены или обновлены) и используйте запись :NEW (вместо того, чтобы пытаться обновить таблицу и попасть в бесконечный цикл триггеров):

CREATE OR REPLACE TRIGGER TRG1
  BEFORE INSERT OR UPDATE ON table1
  FOR EACH ROW
BEGIN
  SELECT name
  INTO   :NEW.name
  FROM   table2
  WHERE  :NEW.id = id;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    :NEW.name := NULL;
END;
/

рабочий пример

Я искренне ценю вашу помощь

adem daradour 18.11.2022 17:04

Другие вопросы по теме