Мультитенантность: как удалить арендатора? - PullRequest
0 голосов
/ 08 января 2012

У меня есть система с общей многопользовательской арендной платой, что означает, что каждая таблица содержит данные для всех арендаторов со столбцом TenantId, чтобы различать их.

Подготовка нового арендатора выполняется быстро и легко, однако сейчас я столкнулся с проблемой удаления одного арендатора.

Учитывая, что сущности зависят друг от друга в отношении согласованности, как мне легко удалить арендатора из моей базы данных, пока система используется другими арендаторами?

Система использует SQL Server 2008 R2, если это помогает.

Ответы [ 3 ]

1 голос
/ 09 января 2012

Как отметил Олег, FK с опцией ON CASCADE должна помочь. Но так как вы не показали нам схему, я не очень уверен, существует ли вероятность того, что система выдаст ошибку, говорящую «Введение ограничения FOREIGN KEY вызывает циклы или множественные каскадные пути». Если вы видите эту ошибку, то вместо CASCADE DELETE добавьте триггер INSTEAD OF DELETE, чтобы выполнить эту работу.

CREATE TRIGGER dbo.Tenants_Delete 
ON dbo.Tenants
INSTEAD OF DELETE
AS
BEGIN;
    --Delete from the Child and Master table as per your need here.
    --Make use of the magic table DELETED
END;
1 голос
/ 08 января 2012

Если я вас правильно понял - это классический случай использования FOREIGN KEYS с опцией ON CASCADE. Вы удаляете только одну запись из таблицы основных арендаторов, и из-за правильной цепочки FKeys система удаляет связанные записи или обновляет ссылочные столбцы с NULL или DEFAULT значением

Иногда не работает в случаях, когда таблица ссылается на себя с DELETE ON CASCADE

0 голосов
/ 18 октября 2012

Вот еще один подход: если удаление арендатора вызывает слишком сильную головную боль, вы можете использовать обходной путь.

Просто добавьте логический столбец active в свою таблицу арендаторов.Затем введите представление, которое выбирает только активных арендаторов.Настройте хранимые процедуры, чтобы искать данные в этом представлении, а не в исходной таблице арендаторов.

...