Для реализации триггера в базе данных, который будет обновлять статус сотрудника (`employee_status`) в зависимости от условий, связанных с его отпусками (`Vocation`), необходимо учитывать, что триггер будет срабатывать при вставке новой записи в таблицу `Vocation`. В зависимости от даты отпуска, нужно изменить статус сотрудника. Ваша рабочая база данных должна поддерживать SQL-триггеры, такие как PostgreSQL, MySQL и другие реляционные СУБД.
Вот пример SQL-триггера и функции, которые могут реализовать эту логику. Предположим, что ваша база данных — PostgreSQL.
### Шаг 1: Создание функции для триггера
Эта функция будет проверять, есть ли активный отпуск на текущую дату, и обновлять статус сотрудника.
```sql
CREATE OR REPLACE FUNCTION update_employee_status()
RETURNS TRIGGER AS $$
DECLARE
count_vocations INT;
BEGIN
-- Считаем количество отпусков с учетом новых данных
SELECT COUNT(*)
INTO count_vocations
FROM Vocation
WHERE employee_id = NEW.employee_id
AND (NEW.start_of_vocation < date_trunc('day', NOW()) + INTERVAL '1 day'
AND NEW.end_of_vocation > date_trunc('day', NOW()));
-- Если есть активные отпуска, устанавливаем статус "в отпуске"
IF count_vocations > 0 THEN
UPDATE Employee
SET employee_status = 1 -- 1 = "в отпуске"
WHERE id = NEW.employee_id;
ELSE
UPDATE Employee
SET employee_status = 0 -- 0 = "действующий"
WHERE id = NEW.employee_id;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
```
### Шаг 2: Создание триггера
Теперь необходимо создать триггер, который будет вызывать ранее созданную функцию при вставке новых записей в таблицу `Vocation`.
```sql
CREATE TRIGGER on_vocation_insert
AFTER INSERT ON Vocation
FOR EACH ROW
EXECUTE FUNCTION update_employee_status();
```
### Объяснение
1. **Функция `update_employee_status`**:
- Когда вставляется новая запись в `Vocation`, функция считает количество отпусков для определенного сотрудника на основе его идентификатора (поле `NEW.employee_id`).
- Если количество активных отпусков больше нуля, статус сотрудника обновляется на "в отпуске" (значение 1).
- Если активных отпусков нет, статус обновляется на "действующий" (значение 0).
2. **Триггер `on_vocation_insert`**:
- Настраивается для выполнения функции `update_employee_status` после каждой вставки новой записи в таблицу `Vocation`.
### Рекомендации
- Убедитесь, что вы правильно настроили пути для обновления статуса, чтобы избежать расхождений между базой данных и логикой приложения.
- Протестируйте триггер с различными сценариями, чтобы удостовериться, что статус обновляется корректно.
- Если вы планируете обновление статуса при удалении записи (например, об окончании отпуска), вы можете создать аналогичный триггер для события `AFTER DELETE`.
### Поддержка на уровне Java
Учтите, что триггер будет работать независимо от Java-кода, который взаимодействует с базой данных. Это значит, что если вы используете ORM (например, Hibernate), настройка триггера всё равно будет актуальна и сохранит согласованность данных.