Нужно ли проверять поля перед внесением изменений, если они имеют функциональную зависимость?
Видимо, я не умею гуглить, раз пишу этот вопрос.
У меня есть база данных, в ней есть три таблицы.
Как видно, две крайние таблицы имеют связь с той, которая находится в центре. Между ними есть зависимость и, соответсвенно, нет нужды дополнительно проверять их в коде (или есть? В этом и вопрос).
Есть код для удаления перевода:
CREATE OR ALTER PROCEDURE [dbo].[DeleteTranslation]
@englishWord NVARCHAR(50),
@russianWord NVARCHAR(50)
AS
BEGIN
DECLARE @englishID UNIQUEIDENTIFIER = (SELECT [ID] FROM [dbo].[EnglishDictionary] WHERE [Word] = @englishWord);
DECLARE @russianID UNIQUEIDENTIFIER = (SELECT [ID] FROM [dbo].[RussianDictionary] WHERE [Word] = @russianWord);
DELETE FROM [dbo].[Translations] WHERE ([EnglishID] = @englishID AND [RussianID] = @russianID);
DELETE FROM [dbo].[EnglishDictionary] WHERE ([ID] = @englishID);
DELETE FROM [dbo].[RussianDictionary] WHERE ([ID] = @russianID);
END
Тут нет проверки на существование других зависимостей у какого-то значения, т.к. эта проверка по сути задана отношением таблицы EnglishDictionary и Translations, т.е. если будет какая-то зависимость, то он не удалит это слово.
Ближе к сути вопроса. При такой ситуации, если у значения будет дополнительная зависимость, то выскакивает это:
Msg 547, Level 16, State 0, Line 2
The DELETE statement conflicted with the REFERENCE constraint "FK_Translations_EnglishDictionary". The conflict occurred in database "Dictionary", table "dbo.Translations", column 'EnglishID'.
The statement has been terminated.
Можно ли как-то эту ошибку игнорировать, кроме случая, где нужно писать проверку на наличие зависимостей в коде (ведь тогда пропадает смысл в зависимости между полями) или какой-то другой способ, чтобы что-то с этим сделать. Назревает вопрос: "Зачем?", но эта база данных управляется из под C#, а там стоит блок try/catch, который отлавливает эту ошибку. Примерно такая-же история с добавлением слова, которое уже есть, выскакивает ошибка с номером 2627, т.к. поле обозначено как primary key. Не хотелось бы, чтобы они ловились блоком try/catch, т.к. приходится обрабатывать эти номера ошибок по-своему.
P.S. Извиняюсь за "кашу", надо будет научиться излагать кратко и понятно свои мысли :)