Создать триггер для обновления строки в той же таблице при выполнении вставки или обновления с использованием postgresql

#postgresql #triggers #plpgsql

#postgresql #триггеры #plpgsql

Вопрос:

Я новичок в plpgsql и пытаюсь использовать приведенный ниже сценарий. Было бы полезно, если бы кто-нибудь мог помочь в этом вопросе.

У меня есть таблица с именем emp_table, и всякий раз, когда вставляется запись, я вызывал триггер для обновления столбца record_status с помощью ‘U’, и когда в таблице выполняется операция вставки, мне нужно обновить столбец статуса записи до ‘I’

Таблица :

 CREATE TABLE emp_data (
name text,
age integer,
designation text,
salary integer,
last_login TIMESTAMP,
record_status varchar
);

CREATE OR REPLACE FUNCTION em_batch_update()
  RETURNS trigger 
  LANGUAGE PLPGSQL
  AS 
$
BEGIN

          IF (TG_OP = 'UPDATE') THEN
            UPDATE emp_data SET record_status = 'U' WHERE record_status is not null; 
            RETURN NEW;
        ELSIF (TG_OP = 'INSERT') THEN
            UPDATE emp_data SET record_status = 'I' WHERE record_status is NULL;
            RETURN NEW;
        end if;
END;
$

CREATE TRIGGER em_sem_batch
BEFORE INSERT OR UPDATE ON emp_data
FOR EACH ROW
EXECUTE PROCEDURE em_batch_update();
 

Я вставил ниже новую запись, но record_status не обновляется.

 insert into emp_data(name,age,designation,salary,last_login) values ('test1234',3,'test1143',1332224,current_timestamp);
 

Я получаю сообщение об ошибке ниже, когда я либо обновляю, либо вставляю,

Функция PL / pgSQL em_batch_update1() строка 5 в инструкции SQL Оператор SQL «ОБНОВИТЬ emp_data УСТАНОВИТЬ record_status = ‘U’ ГДЕ record_status не равен нулю»
Функция PL / pgSQL em_batch_update1() строка 5 в инструкции SQL Оператор SQL «ОБНОВИТЬ emp_data УСТАНОВИТЬ record_status = ‘I’ ГДЕ record_status равно НУЛЮ»
PL / pgSQLфункция em_batch_update1() строка 8 в инструкции SQL Состояние SQL: 54001

может кто-нибудь помочь с этим

Комментарии:

1. Вы все равно не хотели, чтобы это работало по следующим причинам: 1) Действия INSERT и UPDATE не ограничены конкретной записью, они будут UPDATE все записи, которые соответствуют WHERE . 2) INSERT Часть не будет делать то, что вы хотите, поскольку нужная вам запись UPDATE еще не существует. Ошибка, которую вы получаете, связана с 1), вы получаете циклический цикл UPDATE UPDATE , в котором другой диск управляет другим UPDATE и так далее.

Ответ №1:

Нет необходимости в ОБНОВЛЕНИИ. На уровне строки перед триггером вы можете просто присвоить значения:

 CREATE OR REPLACE FUNCTION em_batch_update()
  RETURNS trigger 
  LANGUAGE PLPGSQL
  AS 
$
BEGIN
  IF (TG_OP = 'UPDATE') THEN
    new.record_status := 'U'; 
  ELSIF (TG_OP = 'INSERT') THEN
    new.record_status := 'I';
  end if;
  RETURN NEW;
END;
$
 

Или еще проще:

 CREATE OR REPLACE FUNCTION em_batch_update()
  RETURNS trigger 
  LANGUAGE PLPGSQL
  AS 
$
BEGIN
  new.record_status := left(TG_OP, 1); 
  RETURN NEW;
END;
$