如何在更新某些数据时自动生成sql更新脚本?

时间:2010-05-05 10:43:49

标签: sql sql-server-2008 code-generation triggers

每次在数据库中修改值时,我都想自动生成更新脚本。换句话说,如果存储过程,或查询,或任何更新列a表c中的值b(作为pk列(i,j ... k)),我想生成这个:

update c set a=b where i=... and j=... and k=...

并将其存储在某处(例如,作为表中的原始字符串)。更复杂的是,我希望只有在特定用户进行更新时才会生成脚本。  好消息是我已经为我的所有表定义了一个主键。

我可以看到如何使用触发器执行此操作,但我需要为每个表生成特定的触发器,并且每次我的架构更改时都要更新它们。

我想有一些内置方法可以做到这一点,因为SQL服务器有时需要存储这类东西(例如使用事务复制),但到目前为止找不到任何东西......任何想法?< / p>

我也对自动生成触发器的方法感兴趣(可能使用触发器 - 元触发器,是吗? - 因为我需要在架构更改时自动更新触发器)


这就是我想要这样做的原因。我有一个生产数据库A和一个数据仓库数据库B.我正在使用事务复制来保持数据库同步。我需要能够在不更新生产数据库的情况下更新数据仓库中的某些值。这适用于事务复制,但引发了两个问题,这导致了上述问题:

  • 如何跟踪我所做的手动更改? (我计划在源代码上控制生成的脚本。)
  • 如果需要,如何恢复此数据库,因为执行新快照会丢失所有更新? (应用自动生成的脚本解决了问题)

1 个答案:

答案 0 :(得分:0)

为什么不存储已更改的数据,而不是考虑更新数据的脚本?

由触发器填充的历史记录表对此有好处,因为每次更改都会将新行写入记录更改日期/时间的历史记录表以及执行更改的用户。

历史表将与原始表相同,并添加以下列(当然,使用您自己的命名约定):

update_date datetime DEFAULT CURRENT_TIMESTAMP
update_by_user varchar(100) DEFAULT SYSTEM_USER

然后在表上为基表创建UPDATE的触发器:

CREATE TRIGGER MyTable_Record_Changes
   ON MyTable
   AFTER UPDATE
AS 
BEGIN
    INSERT [MyTable_History] ([col_1], [col_2], ...)
    SELECT [col_1], [col_2], ...
    FROM deleted
END

现在,您可以获得有关数据更改的完整历史记录,包括何时以及由谁进行更改。 然后,您可以根据需要进行这些更改并比较/更新其他数据库。