2016-12-16 96 views
0

问题:保持2代表的设计同步

我有一个数据库2个表:

TableA    TableB 
X, Y, Z    X, Y, Z 

如果I W表AI添加列要以自动复制到B表相同的名称和数据类型(没有明确写入)。在部署

约束:

的表使用更新脚本更新(所以必须能够被称为/在TSQL执行)。 有可能被更新多个表(不过,我可以手的代码,如果需要的映射)

示例更新脚本:

IF NOT EXISTS (SELECT 1 FROM SYS.COLUMNS C INNER JOIN SYS.TABLES T ON C.OBJECT_ID = T.OBJECT_ID 
       WHERE C.NAME = 'W' AND T.NAME = 'TableA') 
BEGIN 
    ALTER TABLE TableA ADD W [Int] NULL 
END 
GO 

在这个剧本我想加我“SyncMyTables” SQL结束

到目前为止,从我的研究,我发现3点可能的方式来解决这个:

  1. 调用一个函数在其同步脚本的表底设计
  2. 某种形式的表触发器(但我不认为触发器是那么聪明)
  3. 一些内联sql,它构建一个更新字符串,然后在数据库上运行它。

选项1似乎对我来说最明智。

我需要什么帮助:

就如何最好地解决这方面的一些指导。

一个例子,指出我在正确的方向。

干杯

请注意,我不想保持同步列的内容,我需要保持表的设计

+2

为什么你不能简单地为两个表运行alter语句?动态执行此操作所需的工作量将超过在一千个更改脚本中更改表名称所付出的难以置信的微不足道的工作量。你在做什么需要动态的SQL,很复杂,以确保你在任何情况下都是100%正确的。不是一个小小的壮举。 –

+0

我在@SeanLange上。或者,您可以修改您的架构并摆脱这两个表中的一个,并向其余表中添加鉴别器列并合并内容。如果您希望读者不了解鉴别器,那么创建2个SQL视图,除了返回数据减去鉴别器之外什么也不做。 – Igor

+0

您可以使用Microsoft Sync Framework,您可以在其中将scope_config和scope_definition设置为要在不同服务器的表之间同步的表集。 –

回答

1

列复制可以用DDL触发器来实现:

CREATE TRIGGER DDL_TableA_TableB 
    ON database 
    FOR ALTER_TABLE 
AS 
BEGIN 
    Declare @CommandText nvarchar(1000) 
    SELECT @CommandText = EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','SYSNAME'); 
    if left(@CommandText, 26) = 'ALTER TABLE dbo.TableA ADD' 
    begin 
     set @CommandText = replace(@CommandText, 'TableA', 'TableB') 
     exec sp_executesql @CommandText 
    end 
end 
+0

这看起来像我之后的解决方案,谢谢,我会在星期一尝试一下! –