我有一个具有共享多租户的系统,这意味着每个表都包含所有租户的数据,并使用TenantId列来区分它们。
配置新租户既快捷又简单,但现在我面临着删除单个租户的挑战。
鉴于实体之间依赖于一致性,如何在我的数据库中轻松删除租户,而其他租户正在使用该系统?
如果有帮助,系统将使用SQL Server 2008 R2。
答案 0 :(得分:1)
如果我说得对 - 这是使用FOREIGN KEYS
和ON CASCADE
选项的经典案例。您只能从主租户表中删除一条记录,并且由于正确的FKeys链,系统会删除相关记录或使用NULL
或DEFAULT
值更新参考列
有时在表引用DELETE ON CASCADE
的情况下不起作用答案 1 :(得分:1)
正如Oleg已经指出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;
答案 2 :(得分:0)
这是另一种方法:如果删除租户会引起太多麻烦,您可以使用解决方法。
只需在租户表中添加一个布尔列active
即可。然后介绍一个只选择活动租户的视图。调整存储过程以在此视图中而不是在原始租户表中查找数据。