1

我正在我的 silverlight 应用程序上实现 CRUD,但是我不想以传统方式实现删除功能,而是我想将数据设置为隐藏在数据库中。

有谁知道使用 SQL Server 数据库执行此操作的方法?

非常感谢帮助。

4

6 回答 6

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 = ...
于 2009-09-09T16:09:31.833 回答
2

扩展 Lukasz 的想法,日期时间列也很有用。

  • NULL = 当前
  • 值 = 软删除时

这增加了简单的版本控制,位列不能,这可能会更好

于 2009-09-09T18:19:55.843 回答
2

在大多数情况下,我宁愿将已删除的行存档到带有删除触发器的存档表中。这样我还可以捕获谁删除了每一行,并且删除的行不会影响我的性能。然后,当您想要包含已删除的表时,您可以创建一个将两个表联合在一起的视图。

于 2009-09-09T18:42:14.370 回答
0

您可以按照Lukasz Lysik 的建议进行操作,并有一个字段用作“已删除”行的标志,当您不希望它们出现时将它们过滤掉。我已经在许多应用程序中使用了它。

如果存在预先存在的状态代码,另一种建议是添加额外的状态分配。例如,在我们内部使用的课堂出勤应用程序中,出勤记录可能是“已导入”、“已注册”、“已完成”、“未完成”等* - 我们为无意重复的时间添加了“已删除”选项. 这样我们就有了记录,而且我们不只是在问题上抛出一个新的专栏。

*这是幕后使用的数字代码的显示名称。只是澄清。:)

于 2009-09-09T16:14:30.670 回答
0

带触发器的解决方案

如果您是 DB 触发器的朋友,那么您可能会考虑:

  • 在表格中添加DeletedAt and DeletedBy
  • 为每个表创建一个视图(例如:对于表Customer有一个CustomerView视图,它将过滤掉DeletedAt不为空的行(gbn与日期列的想法)
  • 您的所有 CRUD 操作都照常执行,但不是在Customer桌面上,而是在CustomerView
  • 添加INSTEAD OF DELETE将行标记为删除而不是物理删除它的触发器。
    • 您可能想要在那里做一些更复杂的事情,例如确保对该行的所有 FK 引用也被“逻辑”删除,以便仍然具有逻辑 参照完整性

如果您选择使用这种模式,我可能会以不同的方式命名我的表TCustomer,和视图,只是Customer为了客户端代码的清晰。

于 2009-09-09T19:50:38.303 回答
-1

小心这种实现,因为软删除会破坏参照完整性,并且您必须使用自定义逻辑在实体中强制执行完整性。

于 2009-09-09T16:12:07.837 回答