Sql server 比较表列(类型、排序规则、可空…),并根据发现的差异更新第二个表列

Sql server 比较表列(类型、排序规则、可空…),并根据发现的差异更新第二个表列,sql-server,tsql,Sql Server,Tsql,我在同一台服务器上有两个数据库,分别名为“DB_prod”和“DB_test”,它们完全相同。 我需要假设有人可以修改“DB_prod”上的表。脚本需要查找所有列差异类型、排序规则、可空、最大长度+查找新列,并在“DB_测试”中将其更改为table。 表之间没有关系 第一步是找出差异,我知道如何做到这一点。 第二步是将所有更改移动到“DB_测试”。 目前我唯一的想法是使用动态sql,所以编写不同的表“alters”并在游标中执行它们 还有别的想法吗 所有工作都需要按程序完成 谢谢您可能正在寻找数

我在同一台服务器上有两个数据库,分别名为“DB_prod”和“DB_test”,它们完全相同。 我需要假设有人可以修改“DB_prod”上的表。脚本需要查找所有列差异类型、排序规则、可空、最大长度+查找新列,并在“DB_测试”中将其更改为table。 表之间没有关系

第一步是找出差异,我知道如何做到这一点。 第二步是将所有更改移动到“DB_测试”。 目前我唯一的想法是使用动态sql,所以编写不同的表“alters”并在游标中执行它们

还有别的想法吗

所有工作都需要按程序完成


谢谢

您可能正在寻找数据库范围的触发器。您可以使用它将alter table语句记录到table TriggerLog中,然后运行存储过程在测试表上执行这些语句

--Table to hold your event data.
CREATE TABLE TriggerLog
(
    Event_Data NVARCHAR(MAX),
    Username NVARCHAR(250),
    Event_Date DATETIME
)

CREATE TRIGGER trg_alter_table ON DATABASE  --database level trigger
FOR ALTER_TABLE
AS
INSERT TriggerLog
  SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)'), 
        COALESCE(SUSER_SNAME(),USER_NAME()), 
        GETDATE();
GO


ALTER TABLE ProdTable
ADD column1 VARCHAR(100);

SELECT *
FROM triggerlog
结果:

            Event_data                               Username         Event_Date
------------------------------------------------------------------------------------------
ALTER TABLE ProdTable ADD column1 VARCHAR(100);     Domain\User     2015-03-16 09:29:47.387 

是否要保留驻留在DB_测试上的数据?否则,您可以只编写数据库脚本并重新部署它—删除旧的DB_测试?或者,您可以备份PROD数据库,并通过DB_测试使用replace恢复它?为什么不使用专门为此类任务设计的工具?例如,SSDT女士?你可以用它自动发布,不需要发明自行车。