W przeciwieństwie do Andomara, byłbym szczęśliwy używając wyzwalacza - ale nie usuwałbym sprawdzania ograniczeń. Jeśli zaimplementujesz go jako instead of
wyzwalacz, możesz zresetować inne wiersze do wartości null przed wykonaniem faktycznego usunięcia:
CREATE TRIGGER T_tabData_D
on tabData
instead of delete
as
set nocount on
update tabData set fiData = null where fiData in (select idData from deleted)
delete from tabData where idData in (select idData from deleted)
Jest krótki, zwięzły, nie byłoby konieczne, gdyby SQL Server mógł obsługiwać kaskady kluczy obcych do tej samej tabeli (w innych RDBMS'ach możesz po prostu określić ON DELETE SET NULL
dla ograniczenia klucza obcego, YMMV).