本篇的本质将是用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 问题中简单设计的东西;这是一个长达数周的项目,以确保您只删除相关内容。例如,配置删除级联的键,然后意外删除“应用程序状态:已批准”枚举记录,因为它一年多前被放入数据库,可能会清除整个数据库,删除每个批准的应用程序(即使是昨天批准的应用程序) )、来自它的每个帐户、他们的所有交易等。
仔细考虑一下