SQL Server数据库 - 隐藏字段?

时间:2009-09-09 16:01:29

标签: sql sql-server database-design hidden-field

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

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

非常感谢。

6 个答案:

答案 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的想法,日期时间列也很有用。

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

这增加了一个简单的版本控制,有点列不能更好地工作

答案 2 :(得分:2)

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

答案 3 :(得分:0)

您可以Lukasz Lysik suggests进行操作,并有一个字段作为“已删除”行的标记,当您不希望它们显示时将其过滤掉。我在很多应用程序中都使用过它。

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

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

答案 4 :(得分:0)

带触发器的解决方案

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

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

我选择使用此模式,我可能会以TCustomer,的方式命名我的表格,仅查看Customer以查看客户端代码的清晰度。

答案 5 :(得分:-1)

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