我有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
)我希望添加一个使用删除at的软删除列。做这件事最好的方法是什么?
是否建议您在数据库中的所有表上使用软删除(deleted_at)来保持其一致性。
发布于 2016-03-21 19:42:28
一致性是关键。
无论您在一个表上使用什么字段名,都要设法使其与其他表保持一致,这在重构代码并需要将新where子句应用于多行代码时将有很大帮助。
使用ALTER TABLE,您可以简单地为deleted添加一个布尔字段,或者您可以记录更多的数据,比如日期/时间,甚至用户。不过,一致性也是关键。无论您使用什么字段名,都要在其他表中保持它的一致性。
然后,您可以创建触发器来更新有关delete的字段信息,还可以取消触发器中的删除。字段名的一致性将大大帮助您在这里。
发布于 2016-03-21 19:33:58
添加字段deleted_time (用户等)并添加触发器以填充删除和取消删除记录上的此字段。在查询的add条件中,deleted_time不是空的。
为了更好地处理当前数据,您可以创建" Customers_arch“这样的新表,并向客户添加delete触发器,通过一些附加字段(如date_time、user等)将客户中的行插入到Customers_arch,那么您就不需要对现有应用程序进行更改查询了。
发布于 2016-03-21 19:48:37
软删除增加了数据设计和查询的复杂性。现在,每个查询都必须记住检查deleted_at。每个联接也必须检查deleted_at。这是人们可能会忘记的事情。
如果你不需要,就不要做。根据您所使用的内容,滚动备份、将记录移动到不同的表或具有“活动”连接表都是更好的设计。
作为后者的一个例子,您将有一个类似于这样的联接表:
CREATE TABLE active_customers (
CustomerID INT REFERENCES Customers(CustomerId)
);这似乎是多余的,但它使关系变得更简单。现在有一种明确的方法来确定谁是活动的和谁不是,查询active_customers并加入customers。触发器可以添加到active_customers中,以便在客户被激活或停用时更新其他表。需要活动客户的关系可以与active_customers相关联,并且不必限定您的联接。
https://stackoverflow.com/questions/36139768
复制相似问题