Sql 创建表或仅添加更改/新列

Sql 创建表或仅添加更改/新列,sql,sql-server,create-table,alter-table,Sql,Sql Server,Create Table,Alter Table,我有几个在开发环境中工作的表,然后转移到生产环境中。如果它们在生产环境中还不存在,可以从SSM生成表创建脚本并运行它。然而,在某些情况下,表已经存在于生产环境中,但所需要的只是一个额外的列或约束。问题是确切地知道发生了什么变化 有没有办法让SQL将我的CREATETABLE语句与现有表进行比较,并只应用已更改的内容?基本上,我正在尝试执行以下操作,SQL正确地抱怨表已经存在 我必须手动编写一个ALTER查询,在一个真实的例子中,由于列的数量太多,这将很困难。有没有更好/更简单的方法来查看发生了什

我有几个在开发环境中工作的表,然后转移到生产环境中。如果它们在生产环境中还不存在,可以从SSM生成表创建脚本并运行它。然而,在某些情况下,表已经存在于生产环境中,但所需要的只是一个额外的列或约束。问题是确切地知道发生了什么变化

有没有办法让SQL将我的CREATETABLE语句与现有表进行比较,并只应用已更改的内容?基本上,我正在尝试执行以下操作,SQL正确地抱怨表已经存在

我必须手动编写一个ALTER查询,在一个真实的例子中,由于列的数量太多,这将很困难。有没有更好/更简单的方法来查看发生了什么变化?请注意,这涉及两个独立的数据库服务器

CREATE TABLE suppliers
( supplier_id int NOT NULL,
  supplier_name char(50) NOT NULL,
  contact_name char(50),
  CONSTRAINT suppliers_pk PRIMARY KEY (supplier_id)
);

CREATE TABLE suppliers
( supplier_id int NOT NULL,
  supplier_name char(50) NOT NULL,
  contact_name char(50),
  contact_number char(20), --this has been added
  CONSTRAINT suppliers_pk PRIMARY KEY (supplier_id)
);

此外,由于数据会丢失,因此不可能删除和重新创建数据。

通常我们使用类似数据库迁移的方法来实现这一点,作为数据库之外的一项功能。例如,在我们的几个C应用程序中,我们有一个名为FluentMigrator的工具。我们编写一个脚本,将代码中需要的新列添加到dev数据库中。调试项目时,FM将运行脚本并修改dev db,dev代码使用新列,一切正常。FM知道不要再次运行脚本

当需要上线时,FM脚本是发布的一部分,该应用程序将上线到网站上,迁移将再次运行,更新live db,以便live代码将使用新的列,但一切仍然正常

如果sql server之外没有任何东西不知道如何管理它,但是..,那么您一定是在编写脚本或使用gui生成脚本来更改数据库,对吗?所以只需保留这些脚本,并将其作为上线过程的一部分运行即可

如果您从一个角度来看,这些数据库已经存在,并且是由其他人创建的,并且他们扔掉了脚本,那么您可以使用数据库模式比较工具一次性赶上。Microsoft在SSDT中有一个-有关如何使用它的更多信息,请参见此处:


如果没有太多约束,我建议您创建一个动态脚本来强制转换数据并将其导入到新表中。如果这没有失败,那么您只需删除旧表并重命名新创建的表。

如果您在表设计器中进行更改,SSMS可以生成架构更改脚本,请在对象资源管理器中右键单击该表并选择“设计”。然后,从菜单中选择表设计器->生成更改脚本,而不是立即应用更改。请注意,根据更改的不同,SSM可能需要重新创建表,尽管数据将被保留。SSMS要求您取消选中该选项,以防止在“工具”->“选项”->“设计器”->“表和数据库设计器”下保存需要重新创建表的更改。检查脚本以确保你能熟练使用它


SQL Server数据工具SSDT和第三方工具(例如来自Red Gate和ApexSQL)具有模式比较功能,可在事后生成所需的DDL。还有一些特性,如迁移脚本,以促进持续集成和源代码管理集成。我建议您将数据库对象置于源代码管理之下,并在开发过程中利用数据库工具。

谢谢-我刚刚测试了生成更改脚本,它向我展示了更改。这就够了!虽然我希望对代码和数据库都采用源代码控制,但我受到供应商SDK的极大限制,该SDK不支持这些类型的功能。