Отфильтрованное ограничение внешнего ключа SQL Server - PullRequest
1 голос
/ 15 мая 2019

Я пытаюсь выполнить мягкое удаление в базе данных SQL Server. У меня есть следующие простые отношения:

Таблица блога:

PK BlogId, Name, Deleted

Таблица сообщений:

PK PostId, FK BlogId, Title, Deleted

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

Но, , как построить ограничение FK с учетом soft-delete , поэтому, когда я устанавливаю запись в блоге как удаленную, это заставит меня пометить все связанные посты как удаленные.

Обновление: я обнаружил, что временные таблицы - очень полезная функция, которая может заменить мягкое удаление, потому что она отслеживает всю историю изменений, включая удаление записей. (но все еще заинтересован в некотором способе мягкого удаленияпод вопросом)

1 Ответ

2 голосов
/ 15 мая 2019

Вы можете создать составной внешний ключ в полях BlogId и Deleted и установить для параметра ON UPDATE значение CASCADE.

CREATE TABLE Blog (
    BlogId INT NOT NULL,
    [Name] VARCHAR(20) NOT NULL,
    Deleted BIT NOT NULL,
    CONSTRAINT PK_Blog PRIMARY KEY (BlogId),
    CONSTRAINT AK_Blog UNIQUE (BlogId, Deleted)
);
GO

CREATE TABLE Post (
    PostId INT NOT NULL,
    BlogId INT NOT NULL,
    Title VARCHAR(20) NOT NULL,
    Deleted BIT NOT NULL,
    CONSTRAINT FK_PostBlog FOREIGN KEY (BlogId, Deleted)
        REFERENCES Blog (BlogId, Deleted)
        ON UPDATE CASCADE
);
GO

INSERT INTO Blog VALUES (1, 'Blog 1', 0);
INSERT INTO Post VALUES (1, 1, 'Post 1', 0);

UPDATE Blog SET Deleted = 1 WHERE BlogId = 1;

-- Notice that the `Deleted` field in `Post` is now '1' and not '0'.
SELECT * FROM Post;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...