触发器从活动表中删除旧记录并插入历史表

Posted

技术标签:

【中文标题】触发器从活动表中删除旧记录并插入历史表【英文标题】:Trigger To delete Old Records from active table and Insert to history table 【发布时间】:2016-03-18 06:50:09 【问题描述】:

sql server 2008

任何人都可以分享他们的专业知识如何实现以下场景

我有两张桌子。 active 和 history 都具有相同的结构。

每当新记录插入活动表时,我想要实现的目标,无论如何 活动表中存在的记录移至历史记录。

我试图只保留当前的活动记录

我有一个名为获取日期的列,如果任何记录的获取日期不同 因为 getdate 必须移动到历史表。那些记录不应该出现 在活动表中。

谢谢

【问题讨论】:

获取日期可能不必等于插入点的 getdate。也许您可以发布一些示例和预期结果 您的实际意图是什么?您是否正在寻找一种方法来获取表中的最新记录? @Squirrel :只想保存活动表中最后一次加载的记录。保留历史表中的所有记录 暂存表?为什么不只是 1)从活动中插入历史选择 2)截断活动表 @Squirrel:请详细说明.. 【参考方案1】:

你有几个语法错误。

我只是在纠正语法

CREATE PROCEDURE BACKUP_TB 
    @tbname varchar(MAX) 
AS 
 BEGIN 
    SET nocount ON; 
    DECLARE @query varchar(MAX) 
    SET @query = 'select * into '+ @tbname + '_backup from ' + @tbname + ''; 
    EXEC (@query) 
    SET nocount OFF; 
END 

你应该注意的几个问题

    SELECT INTO <table name> 将创建新表并插入结果。它只会工作一次。然后第二次运行它,它会给出错误,因为目标表已经存在。您应该使用预先创建所有必要的表并使用insert into backup_table ( <column list> ) select <column list> from original_table

    避免使用SELECT *,最好明确指定列名

    如果您必须使用动态 SQL,请阅读有关它的更多信息。示例:The Curse and Blessings of Dynamic SQL。并注意可能的 SQL 注入攻击。

【讨论】:

非常感谢松鼠

以上是关于触发器从活动表中删除旧记录并插入历史表的主要内容,如果未能解决你的问题,请参考以下文章

设计一种审计表更改的方法

特殊存储过程——触发器Trigger

删除触发器并从另一个表中获取字段

SQL Server 中的历史表

删除旧行 MySQL 触发器 - 初学者

SQL Server - 使用表触发器记录表插入,更新,删除行数