【发布时间】:2012-01-08 16:39:19
【问题描述】:
我有一个共享多租户的系统,这意味着每个表都包含所有租户的数据,并使用 TenantId 列来区分它们。
配置新租户既快捷又简单,但现在我面临删除单个租户的挑战。
鉴于实体相互依赖以保持一致性,我如何在系统正在被其他租户使用时从我的数据库中轻松删除租户?
系统使用 SQL Server 2008 R2,如果有帮助的话。
【问题讨论】:
标签: sql-server database-design multi-tenant
我有一个共享多租户的系统,这意味着每个表都包含所有租户的数据,并使用 TenantId 列来区分它们。
配置新租户既快捷又简单,但现在我面临删除单个租户的挑战。
鉴于实体相互依赖以保持一致性,我如何在系统正在被其他租户使用时从我的数据库中轻松删除租户?
系统使用 SQL Server 2008 R2,如果有帮助的话。
【问题讨论】:
标签: sql-server database-design multi-tenant
如果我没听错 - 这是使用 FOREIGN KEYS 和 ON CASCADE 选项的经典案例。您只从主租户表中删除一条记录,并且由于正确的 FKey 链,系统会删除相关记录或使用 NULL 或 DEFAULT 值更新参考列
有时在表使用 DELETE ON CASCADE 引用自身的情况下不起作用
【讨论】:
正如 Oleg 指出的那样,带有 ON CASCADE 选项的 FK 应该会有所帮助。但由于您没有向我们展示架构,我不太确定系统是否有可能抛出错误,说“引入 FOREIGN KEY 约束会导致循环或多个级联路径”。如果您看到此错误,则可能是添加一个 INSTEAD OF DELETE 触发器来代替 CASCADE 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;
【讨论】:
这是另一种方法:如果删除租户导致太头疼,您也许可以使用解决方法。
只需在您的租户表中添加一个布尔列 active。然后引入一个只选择活动租户的视图。调整您的存储过程以在此视图中而不是在原始租户表中查找数据。
【讨论】: