我们托管另一个组提供的多个SQL Server 2008数据库。它们经常会提供其中一个数据库的新版本的备份,我们会运行一个删除旧版本,恢复新版本,然后进入新恢复的数据库并添加现有SQL登录的例程。该数据库中的用户并为其分配一个存在于所有这些数据库中的标准角色。
例程是相同的,除了每个数据库的数据和日志文件具有不同的名称和不同的逻辑和操作系统名称。我倾向于使用表定义与每个数据库关联的名称集的辅助数据库,然后创建一个存储过程,接受要替换的数据库的名称和备份文件的名称作为参数。 SP将查找关联的逻辑和OS文件名,然后进行工作。
这需要将命令构建为字符串,然后执行它们,这很好。但是,在还原数据库之后,存储过程必须先使用它,然后才能将SQL登录作为用户添加到数据库并将其分配给数据库角色。存储过程无法执行此操作。
创建一个自动化程序的替代方法是动态填充并且可以像这样操作跨数据库吗?
答案 0 :(得分:0)
我提出了自己的解决方案。
创建一个作业来完成工作,指定作业应该在master数据库之外运行,并为它定义一个包含要执行的代码的Transact-SQL步骤。
在为托管作业要使用的对象而创建的实用程序数据库中,创建一个表格,该表格最多包含一行,其数据将作为作业的参数。
在该数据库中,创建一个存储过程,该存储过程可以使用应存储以供作业使用的参数调用(包括要替换的数据库的名称)。 SP应该验证参数,报告任何错误,如果成功,将它们写入参数表并使用msdb..sp_start_job启动作业。
在作业中,对于作业需要引用要替换的数据库的任何语句,将语句构造为字符串并执行它。
对于需要在已重新创建的数据库中运行的任何语句,请双重引用该语句作为sp_executesql IN THAT DATABASE实例的参数,并使用EXECUTE运行整个事务:
SET @statement = @dbName +'..sp_executesql''[在数据库@dbName中执行的语句]''';
EXEC(@statement);
配置作业以将输出写入日志文件。