保持2个表的设计同步

时间:2016-12-16 16:00:20

标签: sql-server database tsql

问题:

我在数据库中有2个表:

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

如果我将列W添加到表A,我想将其自动复制到具有相同名称和数据类型的表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,用于构建更新字符串,然后针对数据库运行它。
  4. 选项1似乎对我来说最明智。

    我需要什么帮助:

    关于如何最好地解决这个问题的一些指导。

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

    干杯

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

1 个答案:

答案 0 :(得分: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