我有几个表在开发环境中工作,然后转移到生产。如果它们尚未存在于生产环境中,则只需从SSMS生成表创建脚本并运行它即可。但是,有时候表格已经存在于生产中,但所需要的只是额外的列或约束。问题是确切地知道发生了什么变化。
有没有办法让SQL将我的CREATE TABLE
语句与现有表进行比较并仅应用已更改的内容?本质上我正在尝试执行以下操作,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)
);
此外,丢弃和重新创建是不可能的,因为数据会丢失。
答案 0 :(得分:1)
如果在表设计器中进行更改,SSMS可以生成模式更改脚本(在对象资源管理器中右键单击表并选择“设计”)。然后,不要立即应用更改,而是从菜单中选择Table Designer - > Generate Change Script。请注意,根据更改,SSMS可能需要重新创建表,尽管将保留数据。 SSMS要求您取消选中“工具 - >选项 - >设计器 - >表和数据库设计器”下的“阻止保存需要重新创建表的更改”选项。查看脚本以确保您使用它。
SQL Server数据工具(SSDT)和第三方工具(例如来自Red-Gate和ApexSQL)具有模式比较功能,可在事后生成所需的DDL。还有一些功能,如迁移脚本,以促进持续集成和源代码控制集成。我建议您将数据库对象保留在源代码管理之下,并将数据库工具作为开发过程的一部分。
答案 1 :(得分:0)
通常我们使用类似数据库迁移的方法作为数据库之外的功能。例如,在我们的几个C#应用程序中,我们有一个名为FluentMigrator的工具。我们编写一个脚本,将代码中需要的新列添加到dev数据库中。调试项目时,FM将运行脚本并修改dev db,dev代码使用新列,一切都很好。 FM知道不再运行脚本
现在是时候发布一些内容,FM脚本是发布的一部分,应用程序被放到网站上,迁移再次运行更新实时数据库,因此实时代码将使用新列,仍然全部很好..
如果你的sql server之外什么都没有(不知道你是怎么管理的,但是......),那么你肯定必须编写脚本(或使用gui来生成脚本)来改变数据库吗?因此,请保留这些脚本并将其作为“上线”过程的一部分运行
如果您从这样一个角度来看这个数据库已经由其他人创建并且他们丢弃了脚本,那么您可以一次使用数据库模式比较工具。微软在SSDT中有一个 - 有关如何使用的更多信息,请参阅此处:
https://msdn.microsoft.com/en-us/library/hh272690(v=vs.103).aspx
答案 2 :(得分:0)
如果您没有很多约束,我建议您创建一个动态脚本来将数据转换并导入到新表中。如果这没有失败,那么你只需删除旧表并重命名新创建的表。