【问题标题】:TSQL - Delete all records in a database older than x daysTSQL - 删除数据库中超过 x 天的所有记录
【发布时间】:2020-07-20 10:36:57
【问题描述】:

我有一个业务需求,需要从多个数据库中删除超过 1 年的所有记录。有没有办法在数据库级别执行此操作,还是必须为每个单独的表编写脚本?

我看到有多种方法可以在表级别执行此操作,但我想知道是否可以在数据库级别执行此操作?

表级:(适用于任何想在表级删除的人):

【问题讨论】:

  • 您需要从每个表中删除行或分区,尽管您可以设置脚本来读取系统表以生成动态SQL。
  • 使用system.tables 查找日期类型为datedatetimedatetime2 的列。然后,检查外部约束并根据它们的顺序构建DELETE 语句。

标签: sql sql-server tsql


【解决方案1】:

本篇的本质将是用SQL来写SQL。这是一个起点:

SELECT DISTINCT REPLACE(REPLACE(REPLACE(
  'DELETE FROM {s}.{t} WHERE {c} < DATEADD(YEAR, -1, GetUtcDate())'
  '{s}', table_name),
  '{t}', table_name),
  '{c}', column_name)
FROM
  INFORMATION_SCHEMA.COLUMNS
WHERE
  column_name like '%Created%'

它查询信息模式以获取包含单词 Created 的所有列的列表(假设:您的表包含名称为 CreatedAt、CreatedOn、CreatedDate、Created、RecordCreated 等的列;根据您的情况进行调整)并放置表/column names 转换成一个删除数据的 SQL 字符串

您运行它,然后将结果从网格复制到另一个查询窗口并运行它。因此它是一个写 SQL 的 SQL

在你理解了这个概念之后,你可以通过让一些程序或动态 SQL 选择删除查询并运行它们来实现自动化

如果你有多个数据库,你也可以“升级”,通过查询sys.databases找出所有需要查询的数据库名称,然后编写一个命中数据库列表并生成变体的SQL 这个命中特定数据库的sql,即命中特定表以进行删除的SQL

这就像《盗梦空间》;在开始深入挖掘之前,请确保您了解洋葱的最外层

请记住,您的数据可能会受到限制,这意味着您必须:

  • 按特定顺序删除它们或
  • 继续重新运行删除,直到不再删除(第一次尝试先父后子删除时,它可能会失败,因为子存在,第二次可能删除所有孩子,所以父母可以被删除 - 如果任何孩子仍然存在这条路线失败,但也许你希望它失败)或
  • 将您的约束配置为删除级联,以便从父级删除记录会从子级删除记录

警告:这是一种严重的破坏性操作,您很容易最终删除超出您预期的内容,或者使您的数据库处于参照完整性被破坏并且您的应用停止工作的状态。

这不是在快速 5 分钟的 SO 问题中简单设计的东西;这是一个长达数周的项目,以确保您只删除相关内容。例如,配置删除级联的键,然后意外删除“应用程序状态:已批准”枚举记录,因为它一年多前被放入数据库,可能会清除整个数据库,删除每个批准的应用程序(即使是昨天批准的应用程序) )、来自它的每个帐户、他们的所有交易等。

仔细考虑一下

【讨论】:

  • “SQL写SQL查询”叫什么名字?
  • 深一层,cannibaliSQLm。分两个层次,很头疼。在 3 级以上,一团糟;)
  • 哦,我想你可以称之为元编程或流行的东西——试试en.wikipedia.org/wiki/Automatic_programming 但考虑到我们用计算机做的几乎所有事情,在编程方面,都是某种形式的代码编写代码(每个人都在在 CPU 中翻转逻辑门之上的某种抽象级别)所以你可以称之为“编程”
  • 有道理。我只是在网站上阅读有关元编程的信息。动态 SQL 是否也被视为“元编程”。?谢谢
  • 我想这取决于你的观点;用另一种编程语言动态形成 SQL,它本质上是一个将被编译、执行并产生输出的程序,这可能适合我。但我刚刚说过,编写一个 C#,并将其编译为被编译成东西,被编译成在硬件上运行的东西也是元编程,也就是编程。只有在你和其他人之间的对话中,你们都理解 X 各自的意思时,才符合 X 的条件才真正重要。编译器哲学!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 1970-01-01
  • 2015-04-01
  • 1970-01-01
  • 2011-07-16
  • 1970-01-01
  • 2020-05-16
相关资源
最近更新 更多