更新/删除时的通用触发器以备份当前行

时间:2014-04-28 11:57:49

标签: mysql sql sql-server

我的情况是这样的:

  • 我有一张桌子,称之为x
  • 每次更新或删除行时,都应将旧行的副本插入x_history
  • 此外x_history将拥有自己的自动递增ID列,称之为histid
  • 拥有自己的id列非常重要,因为这样可以灵活地构建版本恢复功能。

我有100多个表来应用它,所以我正在寻找一个通用触发器,可以用于任何表将一行备份到历史表中。只有2个表名称应在触发器之间变化。指定所有列名称实际上并不是我想要的。

我需要在MySQL中执行此操作,但也添加了MSSQL - 我知道两者都可以很容易地在一个和另一个之间进行转换。

1 个答案:

答案 0 :(得分:3)

通常,触发器不是用于此类目的的最佳解决方案。 如果可能,您可能需要考虑更改数据库设计。 通常情况下,处理此类事情的更好方法是在源表中保留漏洞历史记录,并有一个状态列,告诉您每行是否已删除,更新或当前。

我几乎没有使用MySql的经验,但是我在过去的7年或8年里一直在使用Sql server,所以我要说的是sql server,但MySql可能会有所不同。< / p>

如果您选择使用触发器方法,请记住,即使更新未更改行数据,更新触发器也会执行(例如update tableName set col1 = 1其中idCol = 4,更新触发器将是即使更新前的col1值为1也执行,因此没有更改数据。)

对于SqlServer,您可能需要考虑一个只有6列的公共历史表:
 1.身份栏
 2.表名列
 3. Row Id列(原始表中的原始id)
 4.行状态列(例如更新,删除)
 5.行动日期(行被复制到历史表的日期)
 6.行内容列(这应该是XML数据类型(不确定MySql是否具有此类数据))

然后您所要做的就是使用“SELECT * FROM deleted / inserted FOR XML AUTO”来创建第6个内容。柱。