实现软删除

时间:2016-03-21 19:20:47

标签: sql sql-server-2014 soft-delete

我有SQL Server 2014,大学时我想在所有表上实现软删除。

SET DATEFORMAT dmy

CREATE TABLE Customers
(
    CustomerId int IDENTITY (1,1) not null,
    FirstName varchar (20) not null,
    LastName varchar (30) not null,
    Address1 varchar (30) not null,
    Address2 varchar (30) not null,
    Address3 varchar (30) null,
    Eircode varchar (8) null,
    DateOfBirth date not null,
    CountyId int not null,
    CountryId int not null,
    AssociationId int null,
    CustomerTypeId int not null,
    AccountId int not null
)

我想使用删除时添加一个用于软删除的列。这样做的最佳方式是什么?

是否建议您对数据库中的所有表使用软删除(deleted_at)以保持一致。

3 个答案:

答案 0 :(得分:0)

添加字段deleted_time(用户等)并添加触发器以填充删除和取消删除记录中的此字段。在查询的添加条件中,deleted_time不为空 为了在当前数据上获得更好的性能,您可以创建新的表,如“Customers_arch”,并在删除时向客户添加触发器,将客户行插入到Customers_arch,并添加一些其他字段,如date_time,user等,然后您不需要更改查询。现有的应用程序。

答案 1 :(得分:0)

一致性是关键。

无论您在一个表上使用哪个字段名称,都要尝试使其与其他表保持一致,这在您重构代码并需要将新的where子句应用于多行代码时会有很大帮助。

使用ALTER TABLE您只需为deleted添加一个布尔字段,或者您可以记录更多数据,例如日期/时间甚至用户。但是,一致性是关键。无论您使用哪种字段名称,都要在其他表格中保持一致。

然后,您可以创建触发器以更新有关删除的字段信息,还可以取消触发器中的删除操作。字段名称的一致性将在这里帮助您。

答案 2 :(得分:0)

软删除会增加数据设计和查询的复杂性。现在,每个查询都必须记住检查deleted_at。每个联接也必须检查deleted_at。这是人们可能忘记的事情。

如果您不需要,请不要这样做。根据您使用的内容,滚动备份,将记录移动到不同的表或具有“活动”连接表是更好的设计。

作为后者的一个例子,你有一个像这样的连接表:

CREATE TABLE active_customers (
    CustomerID INT REFERENCES Customers(CustomerId)
);

这似乎是多余的,但它使关系更简单。现在有一种明确的方法可以确定谁是活跃的,谁是活跃的,查询active_customers并加入customers。当激活或停用客户时,可以将触发器添加到active_customers以更新其他表。需要活跃客户的关系可以与active_customers相关联,并避免必须限定您的联接。