创建 table 或仅添加 changed/new 列
Create table or only add changed/new columns
我有几个 table 在开发环境中工作,然后转移到生产环境中。如果它们在生产中尚不存在,则只需从 SSMS 生成 table 创建脚本并 运行 它就可以了。但是,有些情况下 table 已经存在于生产中,但所需要的只是一个额外的列或约束。问题是确切知道发生了什么变化。
有没有办法让 SQL 将我的 CREATE TABLE
语句与现有的 table 进行比较,并且只应用更改的内容?本质上我正在尝试执行以下操作并且 SQL 正确地抱怨 table 已经存在。
我将不得不手动编写一个 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 的工具。我们编写了一个脚本,将我们在代码中需要的新列添加到开发数据库中。调试项目时,FM 将 运行 脚本并修改 dev db,dev 代码使用新列,一切正常。 FM知道不要再运行剧本
当需要上线时,FM 脚本是发布的一部分,应用程序被上线到网站上,迁移 运行 再次更新实时数据库,以便实时代码使用新专栏,一切都很好..
如果您的 sql 服务器之外没有任何东西(不确定您如何管理它,但是..),那么您肯定正在编写脚本(或使用 gui 生成脚本)来改变数据库正确的?因此,只需保留这些脚本并 运行 它们作为 "going live"
过程的一部分
如果您从这些数据库已经由其他人创建并且他们丢弃了脚本的角度来看待这个问题,那么您可以使用数据库架构比较工具一次赶上。 Microsoft 在 SSDT 中有一个 - 有关如何使用它的更多信息,请参见此处:
https://msdn.microsoft.com/en-us/library/hh272690(v=vs.103).aspx
如果您没有太多限制,我建议您创建一个动态脚本来将数据转换并导入到您的新表中。如果这没有失败,那么您只需删除旧表并重命名新创建的表。
如果您在 table 设计器中进行更改(右键单击对象资源管理器中的 table 和 select 设计),SSMS 可以生成模式更改脚本。然后,不是立即应用更改,而是从菜单 select Table Designer-->Generate Change Script。请注意,根据更改,SSMS 可能需要重新创建 table,但数据将被保留。 SSMS 要求您在工具-->选项-->设计器-->Table 和数据库设计器下取消选中 "prevent saving changes that require table re-creation" 选项。查看脚本以确保您能熟练使用它。
SQL 服务器数据工具 (SSDT) 和第三方工具(例如来自 Red-Gate 和 ApexSQL)具有模式比较功能,可以在事后生成所需的 DDL。还有迁移脚本等功能可以促进持续集成和源代码控制集成。我建议您将数据库对象置于源代码控制之下,并在开发过程中利用数据库工具。
我有几个 table 在开发环境中工作,然后转移到生产环境中。如果它们在生产中尚不存在,则只需从 SSMS 生成 table 创建脚本并 运行 它就可以了。但是,有些情况下 table 已经存在于生产中,但所需要的只是一个额外的列或约束。问题是确切知道发生了什么变化。
有没有办法让 SQL 将我的 CREATE TABLE
语句与现有的 table 进行比较,并且只应用更改的内容?本质上我正在尝试执行以下操作并且 SQL 正确地抱怨 table 已经存在。
我将不得不手动编写一个 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 的工具。我们编写了一个脚本,将我们在代码中需要的新列添加到开发数据库中。调试项目时,FM 将 运行 脚本并修改 dev db,dev 代码使用新列,一切正常。 FM知道不要再运行剧本
当需要上线时,FM 脚本是发布的一部分,应用程序被上线到网站上,迁移 运行 再次更新实时数据库,以便实时代码使用新专栏,一切都很好..
如果您的 sql 服务器之外没有任何东西(不确定您如何管理它,但是..),那么您肯定正在编写脚本(或使用 gui 生成脚本)来改变数据库正确的?因此,只需保留这些脚本并 运行 它们作为 "going live"
过程的一部分如果您从这些数据库已经由其他人创建并且他们丢弃了脚本的角度来看待这个问题,那么您可以使用数据库架构比较工具一次赶上。 Microsoft 在 SSDT 中有一个 - 有关如何使用它的更多信息,请参见此处:
https://msdn.microsoft.com/en-us/library/hh272690(v=vs.103).aspx
如果您没有太多限制,我建议您创建一个动态脚本来将数据转换并导入到您的新表中。如果这没有失败,那么您只需删除旧表并重命名新创建的表。
如果您在 table 设计器中进行更改(右键单击对象资源管理器中的 table 和 select 设计),SSMS 可以生成模式更改脚本。然后,不是立即应用更改,而是从菜单 select Table Designer-->Generate Change Script。请注意,根据更改,SSMS 可能需要重新创建 table,但数据将被保留。 SSMS 要求您在工具-->选项-->设计器-->Table 和数据库设计器下取消选中 "prevent saving changes that require table re-creation" 选项。查看脚本以确保您能熟练使用它。
SQL 服务器数据工具 (SSDT) 和第三方工具(例如来自 Red-Gate 和 ApexSQL)具有模式比较功能,可以在事后生成所需的 DDL。还有迁移脚本等功能可以促进持续集成和源代码控制集成。我建议您将数据库对象置于源代码控制之下,并在开发过程中利用数据库工具。