Uda*_*day 1 sql-server sql-server-2012 jobs
IF (SELECT ars.role_desc
FROM sys.dm_hadr_availability_replica_states ars
INNER JOIN sys.availability_groups ag
ON ars.group_id = ag.group_id
AND ars.is_local = 1) <> 'PRIMARY'
BEGIN
--We're on the secondary node, throw an error
THROW 50001, 'Unable to execute job on secondary node',1
END
Run Code Online (Sandbox Code Playgroud)
设置此步骤以在成功时继续下一步,并在失败时退出报告成功的作业。
你能解释一下如何在所有现有的 SQL 服务器作业中添加这个步骤吗?
我创建了一个存储过程,它将为任何现有的代理作业添加一个新的第一步。
它检查是否在 AG 主副本上运行,否则成功退出:
use master
go
-- Adds a first step to specified job, which checks whether running on Primary replica
create procedure AddAGPrimaryCheckStepToAgentJob
@jobname nvarchar(128)
as
set nocount on;
-- Do nothing if No AG groups defined
IF SERVERPROPERTY ('IsHadrEnabled') = 1
begin
declare @jobid uniqueidentifier = (select sj.job_id from msdb.dbo.sysjobs sj where sj.name = @jobname)
if not exists(select * from msdb.dbo.sysjobsteps where job_id = @jobid and step_name = 'Check If AG Primary' )
begin
-- Add new first step: on success go to next step, on failure quit reporting success
exec msdb.dbo.sp_add_jobstep
@job_id = @jobid
, @step_id = 1
, @cmdexec_success_code = 0
, @step_name = 'Check If AG Primary'
, @on_success_action = 3 -- On success, go to Next Step
, @on_success_step_id = 2
, @on_fail_action = 1 -- On failure, Quit with Success
, @on_fail_step_id = 0
, @retry_attempts = 0
, @retry_interval = 0
, @os_run_priority = 0
, @subsystem = N'TSQL'
, @command=N'IF (SELECT ars.role_desc
FROM sys.dm_hadr_availability_replica_states ars
JOIN sys.availability_groups ag ON ars.group_id = ag.group_id AND ars.is_local = 1) <> ''Primary''
BEGIN
-- Secondary node, throw an error
raiserror (''Not the AG primary'', 2, 1)
END'
, @database_name=N'master'
, @flags=0
end
end
GO
Run Code Online (Sandbox Code Playgroud)
博客文章在这里。
注意:对于 SQL Server 2014 以后,您可以使用内置函数sys.fn_hadr_is_primary_replica('dbname')
:
If sys.fn_hadr_is_primary_replica (@dbname) <> 1
BEGIN
-- This is not the primary replica, exit without error.
END
-- This is the primary replica, continue to run the job...
Run Code Online (Sandbox Code Playgroud)