SQL Server 数据库 - 隐藏字段?
-
05-07-2019 - |
题
我正在 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
为了客户端代码的清晰。
请注意这种实现,因为软删除会破坏参照完整性,您必须使用自定义逻辑在实体中强制执行完整性。
不隶属于 StackOverflow