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

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

非常感谢帮助。

有帮助吗?

解决方案

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

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

这增加了简单的版本控制,而位列则无法做到这一点,这可能会更好

其他提示

您可以在表格中添加另一列“已删除”值为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 Lysik建议进行操作用作“已删除”标志的字段行,在您不希望它们显示时将其过滤掉。我在很多应用程序中都使用过它。

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

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

带触发器的解决方案

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top