#sql #postgresql
#sql #postgresql
Вопрос:
Мне нужно создать триггер, который выполняет функцию «modification_function ()», чтобы при вставке, удалении или обновлении каждой строки таблицы «People» функция должна вставлять или обновлять информацию, необходимую для таблицы «People_info», или удалять ее, если она была удалена из таблицы «People_info».Таблица «Люди». Чтобы выполнить какое-либо действие над таблицей «People_info», функция получит всю необходимую информацию из таблиц: «Люди», «Занятость» и «Страна».
Кроме того, атрибут varchar ‘experience’ таблицы ‘People_info’ должен хранить ненулевое значение одного из следующих двух атрибутов таблицы ‘people’: значение атрибута ‘age’ или значение атрибута ‘Date of birth’.
«Возраст» — целое число, а «Дата рождения» — тип date . Поэтому, поскольку ‘experience’ — это varchar, я должен изменить типологию этих данных, используя ‘to_char’.
На самом деле я думаю, что для сохранения ненулевого значения одного из этих атрибутов необходимо выполнить if, чтобы if ‘age’ был РАВЕН НУЛЮ: опыт = дата рождения, ИНАЧЕ опыт = возраст.
Атрибут минимальной заработной платы info_persons должен содержать значения атрибута заработной платы таблицы занятости.
Я настроил схему следующим образом, но я очень заблокирован, когда дело доходит до включения этих требований в код. Я ценю любое предложение по его реализации.
CREATE OR REPLACE FUNCTION modification_function()
RETURNS TRIGGER AS $
BEGIN
IF (TG_OP='UPDATE') THEN
UPDATE PEOPLE_INFO
name =NEW.people.name
id_employee =NEW.employment.id_employee
current employment= NEW.employment.current_employment
minimum_wage= NEW.employment.salary
country_id=NEW.country.country_id
street=NEW.country.street
RETURN NEW;
IF (TG_OP='INSERT') THEN
END IF;
END;
$ LANGUAGE 'plpgsql';
CREATE TRIGGER trigger
AFTER UPDATE OR DELETE OR INSERT ON people
FOR EACH ROW EXECUTE PROCEDURE modification_function();
TABLE PEOPLE:
name PRIMARY KEY
age
date of birth
level of studies
EMPLOYMENT TABLE
id_employee PRIMARY KEY
current_employment
HEADQUARTERS
salary
seniority
COUNTRY TABLE
country_id PRIMARY KEY
street
zip/postal code
PEOPLE_INFO TABLE
name PRIMARY KEY
id_employee PRIMARY KEY
current_employment
minimum_wage
country_id
street
experience
Заранее благодарю
Комментарии:
1. Вы должны прочитать о нормализации. Ваш текущий дизайн просто ужасен из-за избыточности / зависимостей повсюду. Нормализуйте этот дизайн, а затем используйте представления для объединения / агрегирования данных. Вы уже выстрелили себе в ногу и нацеливаете на нее еще один 12-фунтовый…
2. Что ж, именно по этой причине я разместил этот вопрос здесь, чтобы любой, кто хочет и может, мог предложить свою точку зрения. Предполагается, что это место для того, чтобы внести свой вклад
3. «Предполагается, что это место должно быть для того, чтобы внести свой вклад» — так я и сделал. Опять же, я вношу свой вклад, советуя вам ознакомиться с нормализацией и полностью проработать этот вопрос. Было бы слишком для концепции SO кратких вопросов и ответов проработать все это вместе с вами.
4. Как указано @sticky bit, ваша модель данных звучит странно и может быть улучшена: (a) возраст не должен храниться в виде столбца, а должен вычисляться во время выполнения с
age()
помощью функции (b) Зачем вам нужно дублировать данные из таблицы PEOPLE, EMPLOYEE, COUNTRY в таблицу PEOPLE_INFO ? (c) Должна ли новая вставка строки в PEOPLE_INFO запускаться от кого-либо из таблицы PEOPLE, EMPLOYEE, COUNTRY ? Я предлагаю вам сначала поделиться своим определением модели данных в dbfiddle , чтобы мы могли помочь в работе над ним, прежде чем рассматривать определение триггеров.