我正在我的 silverlight 应用程序上实现 CRUD,但是我不想以传统方式实现删除功能,而是我想将数据设置为隐藏在数据库中。
有谁知道使用 SQL Server 数据库执行此操作的方法?
非常感谢帮助。
我正在我的 silverlight 应用程序上实现 CRUD,但是我不想以传统方式实现删除功能,而是我想将数据设置为隐藏在数据库中。
有谁知道使用 SQL Server 数据库执行此操作的方法?
非常感谢帮助。
您可以将另一列添加到值为 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 = ...
扩展 Lukasz 的想法,日期时间列也很有用。
这增加了简单的版本控制,位列不能,这可能会更好
在大多数情况下,我宁愿将已删除的行存档到带有删除触发器的存档表中。这样我还可以捕获谁删除了每一行,并且删除的行不会影响我的性能。然后,当您想要包含已删除的表时,您可以创建一个将两个表联合在一起的视图。
您可以按照Lukasz Lysik 的建议进行操作,并有一个字段用作“已删除”行的标志,当您不希望它们出现时将它们过滤掉。我已经在许多应用程序中使用了它。
如果存在预先存在的状态代码,另一种建议是添加额外的状态分配。例如,在我们内部使用的课堂出勤应用程序中,出勤记录可能是“已导入”、“已注册”、“已完成”、“未完成”等* - 我们为无意重复的时间添加了“已删除”选项. 这样我们就有了记录,而且我们不只是在问题上抛出一个新的专栏。
*这是幕后使用的数字代码的显示名称。只是澄清。:)
带触发器的解决方案
如果您是 DB 触发器的朋友,那么您可能会考虑:
DeletedAt and DeletedBy
列Customer
有一个CustomerView
视图,它将过滤掉DeletedAt
不为空的行(gbn与日期列的想法)Customer
桌面上,而是在CustomerView
INSTEAD OF DELETE
将行标记为删除而不是物理删除它的触发器。
如果您选择使用这种模式,我可能会以不同的方式命名我的表TCustomer,
和视图,只是Customer
为了客户端代码的清晰。
小心这种实现,因为软删除会破坏参照完整性,并且您必须使用自定义逻辑在实体中强制执行完整性。