SQL Server,执行批处理T-SQL脚本在多个数据库上

3
我们的SQL Server 2000实例托管了多个数据库,每个客户都有一个类似的数据库。当需要更新所有数据库时,我们使用Red Gate SQL Compare生成迁移脚本,该脚本在开发数据库和所有客户数据库当前状态的副本之间进行比较。
SQL Compare生成的脚本是事务性的,如果一步出现问题,脚本将回滚所有更改。但是,目前我们的系统使用一种方法,在批处理分隔符(GO语句)上拆分脚本,然后单独运行每个命令,这破坏了所有事务处理。在经典ASP中以编程方式查询数据库时,不支持GO语句。
我想知道如何在所有这些数据库上(例如250个数据库)以编程或手动工具的方式运行该脚本(保留事务)。在Query Analyzer中,我们需要选择每个数据库并按Run按钮,这对于我们拥有的数据库数量来说非常耗时。
5个回答

5

如果您可以使用 SQL 2005 或 2008 的 SSMS,则我建议使用免费的 SSMS 工具包

。该工具包可以帮助您更好地管理和优化您的数据库。


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,并可以并行在多个数据库上运行查询,从而提高性能。


你发给我的链接是 SQL Server 2008 的,这个命令行工具在 SQL Server 2000 中也可以用吗? - MaxiWheat
1
我更新了我的回答。在SQL Server 2000中,该工具被称为osql。 - Lukasz Lysik
1
*.bat文件长什么样? - KM.
说明不完整。您如何读取DB.ini文件?批处理文件长什么样? - AntonK
有没有自动化的方式来处理多个实例和变量?有人有完整的脚本吗?https://dba.stackexchange.com/questions/222930/deploy-one-object-in-database-without-whole-publish-profile - user10634744

1

七年后,我遇到了同样的问题很多次,所以我制作并发布了这个项目:

TAKODEPLOY

以下是一些特点:

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

您可以在此处获取它:https://github.com/andreujuanc/TakoDeploy


0

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


0

如果我没记错的话,你也可以在SQL Compare中创建一个脚本,将所有内容都改回到开始状态。你可能想要生成两个。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接