过去我刚刚为每个表添加了一个字段,并在每次更新/插入时使用GETDATE()进行更新。问题是现在我必须跟踪删除。我想的是只有一个表,我会在发生任何变化时更新,并为所有其他表添加触发器。想法?谢谢!
答案 0 :(得分:4)
如果您有一个历史记录表(与原始表具有相同列的表,加上一个自动增量ID列),您可以跟踪有关原始表更改的所有内容。您可以跟踪插入,删除和每个更改。使用触发器进行插入,更新和删除以将行放入历史记录表中。如果您不需要所有这些选项,请使用您需要的选项。
如果选择在原始表中使用IsDeleted标志,则会使每个查询复杂化,并使活动表中包含许多不需要的行。但这取决于您的需求。
答案 1 :(得分:1)
我见过使用位字段IsDeleted设计的表格,当然默认值设置为false。删除项目时,此值设置为true。然后,所有查询都需要将其影响:
SELECT blah FROM myTable WHERE IsDeleted=0
这样,如果您“意外”删除了一行,您应该可以将其恢复。您也可以每周/每月/每年清除记录。
这只是一个想法。
答案 2 :(得分:1)
如果您使用的是SQL Server 2008,则可以利用new auditing features。
答案 3 :(得分:0)
将记录标记为已删除= 1并且不删除它。在删除时执行触发而不是更新...
答案 4 :(得分:0)
我还看到了一个重复的表,其中添加了标准化的前缀。所有已删除的行都将移动到重复的表中。这消除了保留但忽略原始表中的行的开销。
答案 5 :(得分:0)
所有操作(插入 - 更新 - 删除)都应记录在日志记录表中。我总是记录触发操作的操作,时间戳和用户。将Isdelete列添加到原始表是不好的做法。
答案 6 :(得分:0)
如果您使用的是SQL 2008,则可以使用CDC(更改数据捕获)进行跟踪。
以下链接提供了完整的详细信息。如果要为特定表启用cdc,则会自动删除将要收集的数据。