функция postrgesql для изменения другой таблицы, если изменения происходят в одной из таблиц

#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 , чтобы мы могли помочь в работе над ним, прежде чем рассматривать определение триггеров.