Остановить недопустимые данные в атрибуте с ограничением внешнего ключа с помощью триггеров? - PullRequest
0 голосов
/ 14 мая 2010

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

Например: рассмотреть 2 таблицы R (первичный ключ 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; 

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

1 Ответ

0 голосов
/ 14 мая 2010

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

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 выглядели как беспорядок.

...