【问题标题】:Multi-tenancy: How do I delete a tenant?多租户:如何删除租户?
【发布时间】:2012-01-08 16:39:19
【问题描述】:

我有一个共享多租户的系统,这意味着每个表都包含所有租户的数据,并使用 TenantId 列来区分它们。

配置新租户既快捷又简单,但现在我面临删除单个租户的挑战。

鉴于实体相互依赖以保持一致性,我如何在系统正在被其他租户使用时从我的数据库中轻松删除租户?

系统使用 SQL Server 2008 R2,如果有帮助的话。

【问题讨论】:

    标签: sql-server database-design multi-tenant


    【解决方案1】:

    如果我没听错 - 这是使用 FOREIGN KEYSON CASCADE 选项的经典案例。您只从主租户表中删除一条记录,并且由于正确的 FKey 链,系统会删除相关记录或使用 NULLDEFAULT 值更新参考列

    有时在表使用 DELETE ON CASCADE 引用自身的情况下不起作用

    【讨论】:

      【解决方案2】:

      正如 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;
      

      【讨论】:

        【解决方案3】:

        这是另一种方法:如果删除租户导致太头疼,您也许可以使用解决方法。

        只需在您的租户表中添加一个布尔列 active。然后引入一个只选择活动租户的视图。调整您的存储过程以在此视图中而不是在原始租户表中查找数据。

        【讨论】: