3

我们的 SQL Server 2000 实例托管了多个相似的数据库,每个客户都有一个。当需要全部更新时,我们使用 Red Gate SQL Compare 在开发数据库和所有客户端数据库的当前状态数据库副本之间生成迁移脚本。

SQL Compare 生成一个事务性脚本,如果一个步骤失败,该脚本会回滚所有内容。但目前我们的系统使用一种方法,将脚本拆分为批处理分隔符(GO 语句),然后分别运行每个命令,这会破坏所有事务性内容。编程查询数据库时不支持GO语句(经典ASP)

我想知道如何以编程方式或在工具中手动在所有这些数据库(如 250 DB)上运行该脚本(保留事务)?在Query Analyzer中,我们需要选择每个 DB 并按Run,这对于我们拥有的 DB 数量来说是相当长的。

4

5 回答 5

5

如果您可以使用 SQL 2005 或 2008 中的 SSMS,那么我推荐免费的SSMS 工具包

于 2009-09-22T19:19:55.103 回答
3

我使用外部sqlcmd 命令行工具。我工作的服务器上也有同样的情况。

我有 *.sql 文件中的脚本和第二个文件中的数据库列表。我有一个小的 *.bat 脚本,它遍历所有数据库并使用sqlcmd命令执行脚本。

更详细地说,我有这样的:

  • DB.ini 文件,其中包含我要在其上部署脚本的所有数据库
  • 我存储所有脚本的 sql/ 目录
  • runIt.bat - 部署脚本的脚本

命令行看起来更像这样:

sqlcmd -S <ComputerName>\<InstanceName> -i <MyScript.sql> -d <database_name> -T

在 SQL Server 2000 中,它是osql 实用程序

更新

Red Gate 现在有一个名为SQL Multi Script的工具,它基本上可以满足您的需求。我支持 SQL 2000 到 2008 R2 并在多个数据库上并行运行查询以提高性能。

于 2009-09-22T19:09:32.613 回答
1

7 年后,我多次遇到同样的问题,所以我成功了并发布了这个项目:

塔科德部署

以下是一些功能:

  • 从单个实例获取所有数据库并应用名称过滤器。或者只是一个直接连接。
  • 尽可能多地混合数据库源。例如,两个直接实例和一个完整实例,带或不带过滤器。
  • 脚本编辑器(Avalon Text,相同的 monodevelop 使用)
  • 在执行之前解析脚本并检测错误。
  • 脚本被 GO 语句“分割”。
  • 将您的部署保存到文件中
  • 在部署之前获取所有数据库的列表。
  • 实时查看正在发生的事情(此处推荐使用 PRINT 语句!)。
  • 如果发生任何错误,自动回滚到独立数据库。
  • 通过 Squirrel 进行透明更新。

您可以在以下网址获得它:https ://github.com/andreujuanc/TakoDeploy

于 2016-10-12T00:32:17.183 回答
0

不确定这是否可行,但尝试用分号替换 GO 语句,并在一批中运行整个语句。

于 2009-09-22T19:00:17.217 回答
0

如果我记得,您还可以在 SQL Compare 中创建一个脚本,以将所有内容更改回它开始时的状态。您可能希望同时生成两者。

当我进行这种部署时(已经有一段时间了),我首先加载到一个与 prod 完全相同的登台服务器,然后我开始确保脚本可以在 prod 上运行。如果有任何事情失败(通常是因为脚本运行的顺序,例如,不能将外键设置为尚不存在的表)。我还首先编写了 al 表更改的脚本,然后是所有视图更改,然后是所有 UDF 更改,然后是所有存储的 proc 更改。这大大减少了由于对象尚不存在而导致的失败,但我通常仍然有一些需要调整。

于 2009-09-22T19:40:37.067 回答