Ссылка на внешний ключ и добавление проверочного ограничения для столбца в родительской таблице - PullRequest
2 голосов
/ 27 марта 2019

Как добавить в таблицу BusinessCategories проверку того, что значение столбца IsBusinessCategory равно 'true' для связанного Categories.ID?

CREATE TABLE [dbo].[Categories](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [ParentID] [int] NULL,
    [DisplayNameHe] [nvarchar](400) NOT NULL,
    [DisplayNameEn] [nvarchar](400) NOT NULL,
    [DisplayNameEs] [nvarchar](400) NOT NULL,
    [CreateDate] [datetime] NOT NULL,
    [Status] [bit] NOT NULL,
    [IsBusinessCategory] [bit] NULL
)



CREATE TABLE [dbo].[BusinessCategories](
    [ID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
    [BusinessCategoryID] [INT] NOT NULL REFERENCES Categories(ID) -- Need to check that is 
     businessCategory ==1
    [BusinessID] [INT] NOT NULL REFERENCES Business(ID)
)

Цель состоит в том, чтобы иметь возможность вставлять в столбец BusinessCategoryID только значения из Категории таблица, в которой есть IsBusinessCategory == true .

Ответы [ 2 ]

1 голос
/ 27 марта 2019

Я не рекомендую такое решение, которое должно быть сделано на бизнес-уровне приложения

В стороне 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)
0 голосов
/ 27 марта 2019

Цель состоит в том, чтобы иметь возможность вставлять в столбец значения BusinessCategoryID только из таблицы категорий, в которой есть IsBusinessCategory == true.

Это можно сделать, написав UDF, который принимаетBusinessCategoryID в качестве параметра и запрашивает таблицу категорий, чтобы получить значение IsBusinessCategory.Ограничение CHECK будет просто проверять, является ли возвращаемое значение параметра истинным или ложным.

Однако имейте в виду, что это ограничение будет проверяться только при добавлении строк в таблицу BusinessCategories.Если кто-то изменит значение IsBusinessCategory в таблице Categories, ограничение CHECK его не перехватит.Вам нужно будет наложить отдельное ограничение на таблицу Categories, чтобы поймать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...