【问题标题】:Show Deleted Records point in time SQL Server显示已删除记录的时间点 SQL Server
【发布时间】:2018-02-11 20:31:15
【问题描述】:

我想编写一个函数/存储过程,我想在其中传递日期和时间并获取特定日期和时间存在的所有行,如果在该日期和时间之后删除了记录,它应该显示它们,否则没有.

假设我有一个学生表 (id, name, createdate),今天早上 10:30 之前有 100 行,我今天上午 10:30 删除了 30 条记录,并以今天的日期和时间 10:35 运行我的函数,它应该返回 70 条记录,但如果我使用更早的日期(例如今天上午 09:30)运行该函数,它应该返回 100 条记录。

请在 SQL Server 中为此提供最佳解决方案。我不想创建一个单独的已删除项目表,然后与之进行比较和显示。

【问题讨论】:

  • 你有 database-administration 作为标签,你在哪里寻找 SSMS 中的东西?
  • 您没有说明您的 SQL Server 版本。如果 2016+ 查看时态表
  • 是的。如果版本足够,临时表和 CDC 会涵盖此内容
  • @khurram - 你好!如果您在此处找到有用的答案,请不要忘记接受并投票。这样做,您和他们都获得了良好的声誉,它可以帮助您的问题的未来访问者确定哪个答案是最合适/最有帮助的答案。如果您对此有任何疑问,请查看此链接:how-does-accepting-an-answer-work

标签: sql sql-server database-schema sql-delete


【解决方案1】:

DELETE 删除这些行,它们以后无法查看。

除非您使用的是 Sql Server 2016+,然后您可以使用 System versioned temporal table

你可以创建一个IsActive 列或类似的东西,而不是DELETEUPDATE tbl SET IsActive = 0, dateInactivated = getdate() WHERE...

那么在你的存储过程中你会:

SELECT * 
FROM tbl
WHERE IsActive = 1
OR (IsActive = 0 AND dateInactivated > @myDate)

(编辑原因:下面有帮助的 cmets)

【讨论】:

  • 我无法更改表格,否则我可以添加一个带日期和时间的字段删除,如果我需要显示记录,我可以查询删除字段。
  • 这都包含在临时表或 CDC 中
  • @Nick.McDermaid 和 MartinSmith 我是正确的。如果 OP 使用的是 Sql Server 2016+ System versioned temporal table,你们两个是完全正确的,并且是一个可行的选择。考虑到它适用于早期版本,我仍然喜欢我的答案,但也感谢您帮助我学习新东西。我们还没有在 2016 年开始工作:/.
  • 我听到了!跟上进度可能具有挑战性,尤其是当您专注于保持已有的东西正常运行时!
  • 在此链接red-gate.com/simple-talk/sql/learn-sql-server/… 检索特定时间范围的捕获数据下的部分向您展示了如何在特定时间范围内获取更改。如果您从当前表中获取记录并“减去”过去 24 小时内发生的所有插入,您将获得 24 小时前的表状态。临时表可能会更容易。老实说,我也没有使用过,我只是知道它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 2011-03-20
相关资源
最近更新 更多