#sql-server #tsql #triggers
Вопрос:
Я пытаюсь вставить значения в другую таблицу с помощью триггера после обновления в SQL server.
У меня есть таблица, в которой я храню своих сотрудников (идентификатор сотрудника, имя, результаты экзамена, дата экзамена), и мне нужно создать триггер, который позволяет мне вставлять идентификатор сотрудника, результаты экзамена и дату экзамена в таблицу под названием exams_backlog всякий раз, когда результаты экзамена или дата экзамена обновляются в таблице сотрудники.
Я не знаю, смогу ли я проверить эти поля, чтобы сделать вставку.
Это то, что у меня есть до сих пор:
CREATE TRIGGER updateExamBacklogTrigger
ON employees
AFTER UPDATE
AS
BEGIN
*****HERE IS WHERE I NEED TO CHECK IF ONE OF THOSE TWO FIELDS HAS BEEN UPDATED*****
INSERT INTO exams_backlog SELECT e.employee_id, e.exam_results, e.exam_date FROM employees e
SET NOCOUNT ON;
END
GO
Заранее спасибо.
Комментарии:
1. Что у тебя есть на данный момент?
2. @CaiusJard Я только что отредактировал вопрос, чтобы показать, что у меня есть до сих пор! Заранее спасибо!
3. В ваших
INSERT
колонках вродеemployee_id
нет контекста. Вы не можете ссылаться на столбец без aFROM
. Предположительно, вы должны ссылаться наinserted
псевдо-таблицу.4.docs.microsoft.com/en-us/sql/t-sql/functions/…?
5. @Larnu Вы правы, я отредактировал его, чтобы вставить в него с помощью выбора. Спасибо!
Ответ №1:
Я нашел решение, которое так долго искал:
Поскольку я хотел проверить, были ли обновлены exam_results или exam_date, я использовал
IF(UPDATE(exam_results) OR UPDATE(exam_date ))
А затем, чтобы вставить данные только для тех сотрудников, которые были обновлены, я использовал
INNER JOIN inserted i ON i.employee_id = e.employee_id
Таким образом, полный триггер приводит к следующему:
CREATE TRIGGER updateExamBacklogTrigger
ON employees
AFTER UPDATE
AS
BEGIN
IF(UPDATE(exam_results) OR UPDATE(exam_date ))
INSERT INTO exams_backlog SELECT e.employee_id, e.exam_results, e.exam_date FROM employees e INNER JOIN inserted i ON i.employee_id = e.employee_id
SET NOCOUNT ON;
END
GO
Комментарии:
1. Нет — ЕСЛИ ОБНОВЛЕНИЕ не делает того, что вы думаете. Если вы хотите сделать это только при изменении фактического значения, вам НЕОБХОДИМО сравнить «старую» версию и «новую» версию. Кроме того, нет необходимости присоединять inserted к сотрудникам — таблица insert содержит всю текущую информацию для обновленных строк. Наконец, прекратите ленивое кодирование — всегда указывайте список столбцов в инструкции INSERT.