2016-03-21 60 views
1

我有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)以保持一致。

+0

你还记得申报外键吗? – Schwern

回答

0

一致性是关键。

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

使用ALTER TABLE您可以简单地为deleted添加一个布尔字段,或者您可以记录更多数据,如日期/时间甚至用户。再一次,一致性是关键。无论您使用的是什么字段名称,都可以在其他表格中保持一致。

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

0

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

0

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

如果你不需要它,不要这样做。取决于你使用的是什么,滚动备份,将记录移动到不同的表,或者具有“活动”连接表是更好的设计。

作为后者的例子,你有一个连接表所示:

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

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