Sql server 多租户:如何删除租户?

Sql server 多租户:如何删除租户?,sql-server,database-design,multi-tenant,Sql Server,Database Design,Multi Tenant,我有一个共享多租户的系统,这意味着每个表都包含所有租户的数据,并有一个租户ID列来区分他们 设置一个新租户既快捷又简单,但是现在我面临着删除单个租户的挑战 考虑到实体在一致性方面相互依赖,当系统被其他租户使用时,如何从数据库中轻松删除租户 系统使用SQL Server 2008 R2,如果有帮助的话。如果我没弄错的话-这是使用外键和ON CASCADE选项的典型案例。您仅从主租户表中删除一条记录,由于FKEY链正确,系统将删除相关记录或使用NULL或默认值更新参考列 有时在表引用自身时使用DEL

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

设置一个新租户既快捷又简单,但是现在我面临着删除单个租户的挑战

考虑到实体在一致性方面相互依赖,当系统被其他租户使用时,如何从数据库中轻松删除租户


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

如果我没弄错的话-这是使用
外键
ON CASCADE
选项的典型案例。您仅从主租户表中删除一条记录,由于FKEY链正确,系统将删除相关记录或使用
NULL
默认值更新参考列


有时在表引用自身时使用DELETE ON CASCADE将不起作用,正如Oleg指出的,FK with ON CASCADE选项应该会有所帮助。但由于您没有向我们展示该模式,我不太确定系统是否有可能抛出一个错误,说“引入外键约束会导致循环或多个级联路径”。如果您看到此错误,则可能需要添加一个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;

这里还有另一种方法:如果删除租户会引起太多的麻烦,您可以使用一种变通方法

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