Задать вопрос
alex_lemurski
@alex_lemurski

Как создать триггер для изменения поля одной таблицы по условию из другой?

Никак не могу разобраться в механике написания функции и триггера к нему в базе данных
детали такие:
сущность, в которой должно происходить автомт смета значения поля, в зависимости от условия в другой сущности

ПОЛУЧАТЕЛЬ УСЛОВИЯ
@Entity
class Employee {
.....
@Column(name = "employee_status")
private EmployeeStatusENUM employeeStatusENUM;
(0="действующий", 1="в отпуске", 2=закрыт" --- 0 и 2 задаются через поле в html,
а 1 только автоматом по условию из сущности Vocation
.....
@OneToMany(mappedBy = "employee")
private List vocationList = new ArrayList<>();
(график отпусков, коллекция т.к. годовой отпуск делить можно на несколько частей)

getters, setters...
}

ПОСТАВЩИК УСЛОВИЯ
@Entity
class Vocation {
.....
@Column(name = "date_start")
private LocalDate startOfVocation;
(дата начала отпуска, задается через поле в html)

@Column(name = "days")
private Integer daysOfVocation;
(кол-во дней отпуска, задается через поле в html)

@Column(name = "date_end")
private LocalDate endOfVocation;
(дата окончания отпуска, задается через setter в контроллере, перед сохранением (созданием) новой сущности,
*vocation.setEndOfVocation(vocation.getStartOfVocation().plusDays(vocation.getDaysOfVocation()));*
хотя и это поле можно наверно через триггер заполнять, но не через html, таково указание.
данную сущность Vocation созданную для Employee обновлять нельзя, только создать и удалить)

@ManyToOne
@JoinColumn(name = "employee_id")
private Employee employee;

getters, setters...
}

условие задания employeeStatusENUM = 1 следующее:
если текущая дата находится в диапазоне дат отпуска (вкл день начала и конца)
статус с 0 на 1 и 1 на 0 должно происходить автоматически

677ab81888d42275681385.png
677ab78f8ea4c266930170.png

примеры кусочков таблиц
  • Вопрос задан
  • 111 просмотров
Подписаться Простой 5 комментариев
Пригласить эксперта
Ответы на вопрос 1
@alexalexes
Создаете функцию для триггера:
CREATE OR REPLACE FUNCTION set_empoyee_status()
  RETURNS TRIGGER
  LANGUAGE PLPGSQL
  AS
$$
BEGIN
	IF NEW.date_start <= CURRENT_DATE and NEW.date_end >= CURRENT_DATE  THEN
	   update employee -- тут изменяется таблица работников!
           set employee.empoyee_status = 1
          where employee.emp_id = NEW.employee_id;
          ELSE
          update employee -- тут изменяется таблица работников!
           set employee.empoyee_status = 0
          where employee.emp_id = NEW.employee_id;
	END IF;
	RETURN NEW;
END;
$$

Потом нужно присоединить функцию к триггеру:
CREATE TRIGGER tr_set_employee_status
  BEFORE UPDATE
  ON vocation -- тут на таблицу отпусков вешается триггер!
  FOR EACH ROW
  EXECUTE PROCEDURE set_empoyee_status();

PS: Если функция будет вешаться на разные события (в особенности, на delete), то нужно выбирать NEW/OLD источник записи для определения статуса.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы