Использование триггеров для ссылочной целостности - PullRequest
0 голосов
/ 04 мая 2019

В базе данных есть 2 таблицы, содержащие следующие столбцы:

  1. department таблица со столбцом dept_no (char (4), не ноль)
  2. employee таблица со столбцом dept_no (char (4), null)

Столбец dept_no должен быть определен как первичный ключ в таблице department и внешний ключ вemployee таблица с использованием триггера.

Я подумал, что это было правильное решение с использованием удаленных и вставленных виртуальных таблиц для обновления / удаления внешнего ключа в соответствующей таблице сотрудников:

CREATE TRIGGER trig_delete_dept_no
ON department 
AFTER DELETE
AS 
    UPDATE employee 
    SET employee.dept_no = NULL
    FROM deleted 
    WHERE employee.dept_no = deleted.dept_no

CREATE TRIGGER trig_update_dept_no
ON department 
AFTER UPDATE
AS  
      UPDATE e 
      SET e.dept_no = i.dept_no
      FROM employee e 
      INNER JOIN inserted i ON e.dept_no = i.dept_no

Однако, когда я обновляю строку отдела dept_no на другое значение, я не вижу соответствующего обновления dept_no в таблице сотрудников:

UPDATE department 
SET dept_no = 'd4' 
WHERE dept_no = 'd3'

Удаление функций, как ожидалось.Что я делаю не так с триггером обновления и как я могу объединить эти два триггера в один триггер?

Ответы [ 2 ]

1 голос
/ 04 мая 2019

В вашем дизайне есть проблема. Во-первых, вы не должны использовать dept_no как PK (первичный ключ). Вам необходимо иметь столбец IDENTITY или GUID в качестве первичного ключа и ссылаться на этот столбец как FK (внешний ключ).

Таким образом, вам не нужно беспокоиться об изменении dept_no.

Второй момент - вам не нужен триггер. Вы можете использовать опцию CASCADE для действия DELETE.

Найти больше информации о CASCADE

0 голосов
/ 04 мая 2019

Спасибо, FLICKER и SMor за помощь, чтобы подумать над этим. Я не верю, что назначение хочет, чтобы мы изменили таблицы, добавив столбцы IDENTITY или GUID, и поскольку мы должны строго использовать триггеры, это лучшее решение, которое я могу придумать:

CREATE TRIGGER trig_delete_dept_no ON department  AFTER DELETE AS 
    UPDATE employee 
    SET employee.dept_no = NULL
    FROM deleted 
    WHERE employee.dept_no = deleted.dept_no

CREATE TRIGGER trig_update_dept_no ON department AFTER UPDATE AS
    IF UPDATE(dept_no)
        BEGIN
        IF (SELECT employee.dept_no
            FROM employee, inserted
            WHERE employee.dept_no = inserted.dept_no) IS NULL
            BEGIN
                ROLLBACK TRANSACTION
                RAISERROR ('Integrity constraint violation, TRIGGER: 
                            trig_update_dept_no, TABLE: department',16,1)
            END
        ELSE PRINT 'Update successful'
        END

Это позволит производить обновления в отделе, если в таблице сотрудников нет потерянных записей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...