Я пытаюсь создать триггер, чтобы при добавлении новой записи добавлялась еще одна запись в той же таблице. Поле сеанса будет принимать значения только от 1 до 4. Поэтому, когда я добавляю 1 в сеансе, я хочу, чтобы он добавил еще одну запись, но с сеансом 3 заблокирован. Но проблема в том, что он приводит к каскадным триггерам и вставляет себя снова и снова, потому что триггер срабатывает при вставке.
У меня есть, например, простая таблица:
CREATE TABLE example
(
id SERIAL PRIMARY KEY
,name VARCHAR(100) NOT NULL
,session INTEGER
,status VARCHAR(100)
);
Моя триггерная функция:
CREATE OR REPLACE FUNCTION add_block() RETURNS TRIGGER AS $$
BEGIN
INSERT INTO example VALUES (NEW.id + 1, NEW.name, NEW.session+2, 'blocked');
RETURN NULL;
END;
$$ LANGUAGE 'plpgsql';
Триггер:
CREATE TRIGGER add_block
AFTER INSERT OR UPDATE
ON example
FOR EACH ROW
EXECUTE PROCEDURE add_block();
Я получаю ошибку:
SQL statement "INSERT INTO example VALUES ( $1 +1, $2 , $3 + 2, $4)"
PL/pgSQL function "add_block" line 37 at SQL statement
Эта ошибка повторяется столько раз, что я не вижу верх.
Как бы я решил это?
EDIT:
CREATE TABLE block_rules
(
id SERIAL PRIMARY KEY
,session INTEGER
,block_session INTEGER
);
Эта таблица содержит правила блоков. Таким образом, если новая запись вставляется в таблицу EXAMPLE с сеансом 1, то она соответственно блокирует сеанс 3, вставляя новую запись с заблокированным состоянием в ту же (EXAMPLE) таблицу выше (не block_rules). То же самое для сеанса 2, но он блокирует сеанс 4.
Таблица block_rules содержит правила (или шаблоны) для блокировки сеанса. Он держит
id | session | block_session
------------------------------
1 | 1 | 3
2 | 2 | 4
3 | 3 | 2
Как бы я изложил это в выражении WHEN о триггере, идущем с ответом Эрвина Бранстеттера ниже?
Спасибо