Как вставить в другую таблицу, если один из двух столбцов был обновлен в триггере?

#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 нет контекста. Вы не можете ссылаться на столбец без a FROM . Предположительно, вы должны ссылаться на 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.