我正在尝试创建一个触发器,用于当日志表中的记录超过特定行数时,我想以 x 个旧记录的数量开始清除它们,并以一个新记录的形式保留新记录。特定日期。
当前查询(伪代码):
declare @date datetime
SET @date = 'certaindate'
CREATE TRIGGER PURGE_USERS ON UsersAD FOR DELETE
AS DELETE
FROM UsersAD WHERE ROWCOUNT(UsersAD) > x and updateDate < @date
GO
-- UPDATE: Might have to partition instead of delete.
我假设您已明白我的意思,但是我既不知道如何创建触发器以开始删除记录,也不知道找到何时删除记录的好方法。
感谢帮助,
谢谢。
答案 0 :(得分:4)
更好的策略可能是对表进行分区。分区比const funcWithArgs = argCount => (props, propName, componentName) => {
var func = props[propName];
if (typeof func !== 'function' || func.length !== argCount) {
return new Error(
`${propName} must be a function with ${argCount} number arguments`,
);
}
};
Component.propTypes = {
onClick: funcWithArgs(1)
}
更好,因为与删除一堆记录相比,您可以更有效地删除分区。
您尤其不希望在触发器中进行大量删除,因为在插入期间表可能保持锁定状态。您希望插入会很快。 。 。突然之间真的很慢。
通常,分区将用于保留固定时间段的数据。假设您每周可以有一个单独的分区,并保留最近100周的数据。
您可以在documentation中了解有关分区的更多信息。
答案 1 :(得分:3)
评论太久了。
通常,您不想将数据保留策略与表中的行数相关联,而是与记录的数据保持相关性的时间范围相关联。
根据用例,业务规则以及可能的适用法律,您将需要确定x
小时,天,周,月或年的日志数量。做出决定后,只需按适当的时间表设置作业以删除不再需要的记录即可。
了解保留期限也将有助于确定定义表分区的粒度,正如Gordon Linoff指出的那样,这可能是长期处理数据删除的最有效方法。事前需要付出更多的努力,但是当您以后没有对意外的速度进行故障排除时,将来的自己会感谢您抽出宝贵的时间来做。
答案 2 :(得分:0)
对于那些令人好奇的事情,我决定创建一个 Function ,而不是创建一个 Trigger ,但是在SQL Server中,您必须创建一个具有某种回报的Function价值,这不是我想要的情况。因此,在进行了更多研究之后,我不得不进行一次存储过程,然后每天执行一次。在我的查询中,只需对其进行实现即可,因为它使我有足够的时间来查看一周内发生的情况,因此它会在每周之后清理日志。
再次感谢。