Остановить недопустимые данные в атрибуте с ограничением внешнего ключа с помощью триггеров?

129
6

Как указать триггер, который проверяет, есть ли данные, вставленные в атрибут внешнего ключа таблицы, фактически существует в таблице ссылок. Если он не существует, действие не должно выполняться, иначе триггер должен удалить вставленный кортеж.


Например: Рассмотрим 2 таблицы         R (первичный ключ A int) и         S (B int Первичный ключ, A int Внешние ключи Ссылки R (A)).


Я написал триггер следующим образом:


Create Trigger DelS
BEFORE INSERT ON S
FOR EACH ROW
BEGIN
Delete FROM S where New.A <> ( Select * from R;) );
End;

Я уверен, что делаю ошибку, указывая внутренний суб-запрос в начале и конце блоков триггера. Мой вопрос: как я могу сделать такой триггер?

спросил(а) 2021-01-19T17:13:56+03:00 3 месяца, 2 недели назад
1
Решение
122

Не будет ли ограничение внешнего ключа лучше достигать того, что вы хотите?


ALTER TABLE [dbo].[TABLE2]  WITH CHECK 
ADD CONSTRAINT [FK_TABLE2_TABLE1] FOREIGN KEY([FK_COLUMN])
REFERENCES [dbo].[TABLE1] ([PK_COLUMN])
GO

Это то, что должны делать ограничения внешнего ключа - в частности, не допускать вставки записи, нарушающей отношения внешнего ключа.


Обратите внимание, что чтобы сделать этот пример более читаемым, я использовал разные имена столбцов и таблиц - S, A, R и B выглядели как беспорядок.

ответил(а) 2021-01-19T17:13:56+03:00 3 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема