powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Триггер добавление\удаление данных на основании условия
5 сообщений из 5, страница 1 из 1
Триггер добавление\удаление данных на основании условия
    #39497490
FeonoR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу помощи в, казалось бы, такой просто штуке как вставка данных в другую таблицу на основании какого-то условия.
Итак суть:
Есть две таблицы:
Люди:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE "public"."persons" ( 
	"id" Integer DEFAULT nextval('person_id_seq'::regclass) NOT NULL,
	"surname" Character Varying( 100 ) NOT NULL,
	"name" Character Varying( 100 ) NOT NULL,
	"patronymic" Character Varying( 100 ),
	"date_birth" Date NOT NULL,
	"place_birth" Character Varying( 1000 ) NOT NULL,
	"parent_id" Integer,
	"surnamepat" Character Varying,
	"surnamepat_short" Character Varying,
	PRIMARY KEY ( "id" ) );


История законных представителей:
Код: plsql
1.
2.
3.
4.
5.
6.
CREATE TABLE "public"."history_legal_representatives" ( 
	"id" Integer DEFAULT nextval('history_legal_representative_id_seq'::regclass) NOT NULL,
	"person_id" Integer NOT NULL,
	"person_parent_id" Integer NOT NULL,
	"modified" Date DEFAULT ('now'::text)::date,
	PRIMARY KEY ( "id" ) );



Где соответственно поля:
Код: plsql
1.
2.
"person_id" - Человек (в таблице persons - id)
"person_parent_id" - Законный представитель (в таблице persons - parent_id)



Что пытаюсь сделать:
При добавлении в таблицу persons записи, у которой parent_id - не указан, просто добавляем эту запись, если же parent_id указано, то в таблицу history_legal_representatives добавляем запись - person_id:= persons.id и person_parent_id:=persons.parent_id.
При редактировании записей в таблице persons , если значение parent_id становится NULL удалить такую пару из history_legal_representatives . (если такая логина неверна, прошу указать почему\как правильнее)

Сам код:
Добавление
Код: plsql
1.
CREATE TRIGGER addrep BEFORE INSERT ON "public"."persons" FOR EACH ROW EXECUTE PROCEDURE addrepresentative()


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE OR REPLACE FUNCTION public.addrepresentative()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$
BEGIN
	if NEW.parent_id != NULL then
	insert into history_legal_representatives (person_id, person_parent_id) 
	values (NEW.id, NEW.parent_id);
	end if;
	RETURN NEW;
END;
$function$



Удаление
Код: sql
1.
CREATE TRIGGER delrep BEFORE UPDATE ON "public"."persons" FOR EACH ROW EXECUTE PROCEDURE delrepresentative()


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE OR REPLACE FUNCTION public.delrepresentative()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$
BEGIN
	if NEW.parend_id = null then
	delete from history_legal_representatives where id = NEW.id;
	end if;
	RETURN NEW;
END;
$function$



Сильно прошу не пинать, в sql не особо силен, хочу сделать это для того, чтобы в вебе это не мудрить.
...
Рейтинг: 0 / 0
Триггер добавление\удаление данных на основании условия
    #39497491
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FeonoR,

проверка на null делается через is, а не =: a is null/a is not null.
...
Рейтинг: 0 / 0
Триггер добавление\удаление данных на основании условия
    #39497499
FeonoR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, большое спасибо.. оказалось, что еще и нельзя делать BEFORE, только AFTER, т.к. мол в тот момент нет такой записи и нельзя на нее ссылаться в другой таблице.
...
Рейтинг: 0 / 0
Триггер добавление\удаление данных на основании условия
    #39497513
FeonoR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ок...с добавлением разобрались...а вот удаление, почему-то не удаляет...
...
Рейтинг: 0 / 0
Триггер добавление\удаление данных на основании условия
    #39497518
FeonoR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашел еще ошибку :( неправильный id брал при удалении - нужен был person_id
Можно закрывать тему.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Триггер добавление\удаление данных на основании условия
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]