Мультитенантность: как удалить арендатора?

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

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

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

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


person Dor Rotman    schedule 08.01.2012    source источник


Ответы (3)


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

Иногда не работает, если таблица ссылается на себя с помощью DELETE ON CASCADE.

person Oleg Dok    schedule 08.01.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;
person vmvadivel    schedule 09.01.2012

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

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

person Gruber    schedule 18.10.2012