0

我们托管由另一个组提供的多个 SQL Server 2008 数据库。每隔一段时间,他们会提供其中一个数据库的新版本的备份,我们会执行删除旧数据库、恢复新数据库、然后进入新恢复的数据库并添加现有 SQL 登录的例程该数据库中的用户并为其分配所有这些数据库中都存在的标准角色。

该例程是相同的,只是每个数据库的数据和日志文件具有不同的名称以及不同的逻辑和操作系统名称。我的倾向是建立一个辅助数据库,其中包含一个定义与每个数据库关联的名称集的表,然后创建一个存储过程,接受要替换的数据库的名称和备份文件的名称作为参数。SP 会查找相关的逻辑和操作系统文件名,然后进行工作。

这需要将命令构建为字符串,然后执行它们,这很好。但是,存储过程在恢复数据库之后,必须先使用它,然后才能将 SQL 登录作为用户添加到数据库并将其分配给数据库角色。存储过程不能做到这一点。

有什么替代方法可以创建一个动态填充的自动化过程,并且可以像这样操作跨数据库?

4

1 回答 1

0

我想出了自己的解决方案。

  1. 创建一个作业来完成这项工作,指定该作业应该在主数据库之外运行,并为其定义一个包含要执行的代码的 Transact-SQL 步骤。

  2. 在仅为托管作业使用的对象而创建的实用程序数据库中,创建一个最多包含一行的表,其数据将作为作业的参数。

  3. 在该数据库中,创建一个可以使用应存储以供作业使用的参数调用的存储过程(包括要替换的数据库的名称)。SP 应验证参数,报告任何错误,如果成功,将它们写入参数表并使用 msdb..sp_start_job 启动作业。

  4. 在作业中,对于作业需要引用要替换的数据库的任何语句,将语句构建为字符串并执行它。

  5. 对于需要在已重新创建的数据库中运行的任何语句,请双引号将该语句用作该数据库中 sp_executesql 实例的参数,并使用 EXECUTE 运行整个内容:

    SET @statement = @dbName + '..sp_executesql ''[要在数据库中执行的语句@dbName]''';

    执行(@语句);

  6. 配置作业以将输出写入日志文件。

于 2013-01-18T21:27:56.263 回答