#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;
$