我正在我的silverlight应用程序上实现CRUD,但是我不想以传统方式实现Delete功能,而是我想将数据设置为隐藏在数据库中。
有没有人知道使用SQL Server数据库执行此操作的方法?
非常感谢。
答案 0 :(得分:9)
您可以将另一列添加到“已删除”表中,其值为0或1,并仅显示已删除= 0的记录。
ALTER TABLE TheTable ADD COLUMN deleted BIT NOT NULL DEFAULT 0
您还可以创建仅取消删除行的视图。
CREATE VIEW undeleted AS SELECT * FROM TheTable WHERE deleted = 0
你删除命令看起来像这样:
UPDATE TheTable SET deleted = 1 WHERE id = ...
答案 1 :(得分:2)
扩展Lukasz的想法,日期时间列也很有用。
这增加了一个简单的版本控制,有点列不能更好地工作
答案 2 :(得分:2)
在大多数情况下,我宁愿将删除的行存档到带有删除触发器的存档表。这样我也可以捕获删除每一行的人,删除的行不会影响我的性能。然后,您可以创建一个视图,在要包含已删除的表时将两个表联合在一起。
答案 3 :(得分:0)
您可以Lukasz Lysik suggests进行操作,并有一个字段作为“已删除”行的标记,当您不希望它们显示时将其过滤掉。我在很多应用程序中都使用过它。
另一个建议是,如果存在预先存在的状态代码,则添加额外的状态分配。例如,在课堂考勤应用程序中,我们在内部使用出勤记录可以是“已导入”,“已注册”,“已完成”,“未完成”等。* - 我们在无意中重复的时间添加了“已删除”选项。这样我们就有了记录,我们不只是在这个问题上抛出一个新专栏。
*这是幕后使用的数字代码的显示名称。只是澄清一下。 :)
答案 4 :(得分:0)
带触发器的解决方案
如果您是DB触发器的朋友,那么您可以考虑:
DeletedAt and DeletedBy
列Customer
有一个CustomerView
视图,该视图会过滤掉DeletedAt
非空的行(想法 gbn < / em> with date columns)Customer
表上,而是在CustomerView
INSTEAD OF DELETE
触发器,将该行标记为删除而不是物理删除它。
我选择使用此模式,我可能会以TCustomer,
的方式命名我的表格,仅查看Customer
以查看客户端代码的清晰度。
答案 5 :(得分:-1)
请注意这种实现,因为软删除会破坏参照完整性,您必须使用自定义逻辑在实体中强制执行完整性。