Я не рекомендую такое решение, которое должно быть сделано на бизнес-уровне приложения
В стороне SQL есть хитрый способ, не оптимальный, но выполнимый ...
Сначала создайте скалярную функцию, которая возвращает значение isBusinessCategory выбранной категории
CREATE FUNCTION fn_isBusinessCategory (@CatID INT) RETURNS INT
AS
BEGIN
RETURN (SELECT isBusinessCategory FROM Categories WHERE CategoryID = @CatID)
END
GO
Создайте еще одну скалярную функцию, которая возвращает 1, если на данную категорию ссылаются в BusinessCategories
CREATE FUNCTION fn_isBusinessCategoryValid (@CatID INT, @isBusinessCat BIT) RETURNS BIT
AS
BEGIN
IF @isBusinessCat = 1
RETURN 1
ELSE IF EXISTS (SELECT 1 FROM BusinessCategories WHERE CategoryID = @CatID)
RETURN 0
ELSE
RETURN 1
END
GO
Добавить следующие ограничения
Шаг 1 Внешний ключ для проверки целостности между двумя таблицами
ALTER TABLE BusinessCategories ADD CONSTRAINT FK_BusinessCategory
FOREIGN KEY (CategoryID)
REFERENCES Categories (CategoryID)
Шаг 2 Проверка ограничения для проверки этой категории is_businessCategory
ALTER TABLE BusinessCategories ADD CONSTRAINT ck_BusinessCategory
CHECK (dbo.fn_isBusinessCategory(CategoryID) = 1)
Шаг 3 Проверьте ограничение, чтобы предотвратить изменение категории как non businessCategory при использовании
ALTER TABLE Categories ADD CONSTRAINT ck_Category_isBusinessCategory
CHECK (dbo.fn_isBusinessCategoryValid(CategoryID, isBusinessCategory) = 1)