我想在 SQL Server 2008 维护计划中的序列中添加一个条件。此条件基于 T-SQL 语句任务设置的变量:
declare @primary bit = 0
select @primary=1
from sys.database_mirroring
where mirroring_role = 1
如何通过优先约束编辑器执行此任务?
答案1
我同意 SQLChicken 的观点。您无法通过在 SQL Management Studio 中创建的简单维护计划来检查变量。您需要编写脚本并将其放入 SQL 作业中,或者创建一个完整的 SSIS 包。SSIS 将为您提供通过 SSMS 可用的所有维护计划任务以及 SSIS 的所有其他好处,包括您可以在优先约束中使用的包变量。
答案2
老实说,如果您要进行这样的高级调整,最好编写解决方案脚本,然后通过代理进行安排。维护计划虽然非常适合执行非常简单的任务,但确实有其局限性。
答案3
我有一个解决方案,但它并不优雅。虽然可行,但它只是一个临时解决方案,永远不会被视为“最佳实践”。
解决方案涉及使用人为生成的错误来控制流程,并调整包属性,以便调用作业的整体错误状况按照我们希望的方式报告成功或失败。
首先,创建一个带有条件检查的执行 T-SQL 语句任务。从原始问题中的示例来看,它看起来如下:
if not exists (select * from sys.database_mirroring where mirroring_role = 1)
begin
raiserror('not primary', 16, 1)
end
如果这不是镜像主数据库,则此代码会生成错误,如果这是主数据库,则不会生成错误。接下来,创建第二个执行 T-SQL 语句任务并将其链接到第一个任务,并设置成功条件。如果这不是镜像主数据库,我们将不会执行第二个任务,并且序列将结束。如果这是主数据库,我们将继续执行第二个任务。第二个任务使用如下代码生成虚拟错误:
raiserror('dummy error', 16, 1)
现在创建第三个任务,并将其与第二个任务关联起来,并设置失败条件。在第三个任务中,如果第一个任务中的条件为真,则执行您想要执行的任何操作。这可以是另一个执行 T-SQL 语句、备份任务、更新统计信息任务或其他任何任务。如果条件为假,我们将在第一个任务之后离开该序列。如果条件为真,我们将通过虚拟错误继续执行第三个任务,该任务实际上会完成我们想要完成的工作。
任务 2 中出现虚拟错误的原因是为了让调用作业的最终错误状态报告我们想要的结果,并且我们还需要调整其他一些包属性以使其正常工作。转到属性窗口(如果未打开,请从任意一个任务上的右键单击菜单中打开它)并单击顶部的下拉菜单。这列出了您可以更改属性的所有维护计划元素。单击 Subplan_1 序列,其中 Subplan_1 是您正在处理的子计划的名称。将 FailParentOnFailure 更改为 False。当我们在任务 1 中生成条件错误或在任务 2 中生成虚拟错误时,这将使调用作业不会报告错误。接下来,转到 MyPackage 包的属性,其中 MyPackage 是您正在处理的包的名称。将 MaximumErrorCount 更改为 2。当任务 2 中的虚拟错误仅生成一个错误时,这将导致调用作业报告成功,但如果第三个任务也生成错误,则报告失败。如果唯一的错误是由任务 1 中的条件检查产生的,它也会报告成功。
就是这样,我希望有人发现这很有用。
答案4
对我来说,无需在 SQL 实例上安装信息服务,执行条件维护计划的最简单方法是使用 SQL Server 数据工具 (固态硬盘驱动器):
- 从这里下载 SSDT 的安装(免费): https://docs.microsoft.com/en-us/sql/ssdt/download-sql-server-data-tools-ssdt
- 创建一个新的 SSIS 项目。新项目包含的文件之一是包.dtsx它是一个 XML 文件。
- 使用以下查询从数据库中选择维护计划的 XML:
SELECT id, name, description, CAST(CAST(packagedata AS varbinary(MAX)) AS varchar(MAX)) xml_str FROM msdb.dbo.sysssispackages with(nolock) WHERE name='your maintenance plan name';
- 将 xml_str 列值复制粘贴到包.dtsx您创建的 SSIS 项目文件。
- 添加变量并添加'执行 SQL 任务' 节点。'执行 SQL 任务' 允许您使用选择检索变量中的数据,这与 SQL Server 维护计划中的 '执行 T-SQL 语句任务' 不同。一旦插入 SQL 维护计划,'执行 SQL 任务' 就有 GUI 可以直接在 SSMS 中编辑,而无需 SSDT。但只能使用 SSDT 或直接更改维护计划的 XML 的 SQL 添加和编辑变量。别忘了保存。
- 将 XML 作为文本复制到剪贴板中包.dtsx文件并使用 SQL 命令更新维护计划包裹数据领域的msdb.dbo.sysssis 包表。现在,如果您使用 SSMS 打开维护计划,您会发现添加的“执行 SQL 任务”具有 GUI,甚至可以从 SSMS 完美配置。
- 在将所需信息收集到变量中的“执行 SQL 任务”之后,使用表达式创建约束/链接。约束/链接必须连接应有条件执行的节点。表达式将指示流程应遵循哪些约束/链接,哪些不应遵循。表达式利用变量数据作为条件。这可以通过 SSMS GUI 完成,无需其他工具。
当然,如果您确切知道必须修改哪些 XML 以用于变量以及将“执行 SQL 任务”修改为目标维护计划的包数据 XML,那么所有这些都是可以实现的,无需 SSDT,只需使用纯更新 SQL 命令即可。一旦插入一个维护计划,就可以通过 SSMS GUI 将“执行 SQL 任务”节点复制并粘贴到其他维护计划中,而无需其他工具。不幸的是,变量并非如此。