2016-12-09 15 views
1

アクティブなサーバーとパッシブサーバーを判別して、自動的にSQLエージェントジョブを有効または無効にしたいと考えています。つまり、ジョブが有効になっているプラ​​イマリサーバがセカンダリサーバにフェールオーバーすると、ジョブは無効になり、セカンダリサーバ(今はプライマリ)上のジョブが有効になります。SQLエージェントジョブを自動的に有効/無効にする

私は私が必要とする正確に何をして私の基準をわずかに修正したスクリプトが見つかりました: http://sqlmag.com/blog/alwayson-availability-groups-and-sql-server-jobs-part-28-additional-options-tackling-jobs-failo

ALTER procedure [dbo].[SQLAgentJobFailover] (@agname varchar(200)) 
AS 
BEGIN 
    declare @is_primary_replicate bit 
    declare @job_name VARCHAR(100) = 'MySQLAgentJobName' 
    declare @job_enabled bit 

    select @is_primary_replicate = master.dbo.fn_hadr_group_is_primary(@agname) 

    declare job_cursor cursor for 
    select s.name from msdb.dbo.sysjobs s 
    inner join msdb.dbo.syscategories c on s.category_id = c.category_id 
    where c.name = @agname 
    order by name 

    open job_cursor 
    fetch next from job_cursor into @job_name 
    while @@fetch_status = 0 
    begin 
      select @job_enabled=enabled from msdb.dbo.sysjobs where name = @job_name 
      if @is_primary_replicate = 1 
      begin 
       if @job_enabled = 1 
         print @job_name+' enabled on primary. do nothing' 
       else 
       begin 
         print @job_name+' disabled on primary. enable it !' 
         exec msdb.dbo.sp_update_job @job_name = @job_name,@enabled = 1 
       end 
      end 
      else if (@is_primary_replicate = 0) 
      begin 
       if @job_enabled = 1 
       begin 
         print @job_name+' enabled on secondary. disable it !' 
         exec msdb.dbo.sp_update_job @job_name = @job_name,@enabled = 0 
       end 
       else 
         print @job_name+' disabled on secondary. do nothing' 
      end 
      fetch next from job_cursor into @job_name 
    end 
    close job_cursor 
    deallocate job_cursor 
END 

GO 

また、ここでは、関数のスクリプトです:

ALTER FUNCTION dbo.fn_hadr_group_is_primary (@AGName sysname) 
RETURNS bit 
AS 
    BEGIN 

      DECLARE @PrimaryReplica sysname; 

      SELECT @PrimaryReplica = hags.primary_replica 
      FROM 
        sys.dm_hadr_availability_group_states hags 
        INNER JOIN sys.availability_groups ag ON ag.group_id = hags.group_id 
      WHERE 
        ag.name = @AGName; 

      IF UPPER(@PrimaryReplica) = UPPER(@@SERVERNAME) 
        RETURN 1; -- primary 

      RETURN 0; -- not primary 

    END; 
GO 

しかし、私は実行時にセカンダリサーバーは次のようになります。

exec master.dbo.SQLAgentJobFailover @agname = 'CorpAnalyticsAG' 

コマンドは正常に完了しましたが、ジョブは無効になっていません。

私には理由が分かりません。以下は

は私のAG名

enter image description here

任意のアイデアですか?

+2

と同じであるかどうかをテストする必要がありますか?変数@job_nameを何かに設定することは、カーソル内で直ちに変更するので無駄です。あなたが1つの仕事のためにこれをやろうとするならば、あなたは全くカーソルを必要としません。また、masterや他の場所に関数dbo.fn_hadr_group_is_primaryを作成しましたか?その関数のコードを貼り付けて、それが良いかどうかを確認します。また、おそらくあなたは正しい(at)agname(可用性グループ名)を渡していないので、カーソル選択で行が返されず、何も処理が行われません..... – Matt

+0

はい、110%右ですカーソルが必要です。私はカーソルセクションをコメントアウトするとすぐに思えた、ストアドプロシージャが正常に実行され、ジョブを有効にしました。あなたがあなたのコメントを答えとして書くなら、私は喜んでそれを受け入れるでしょう – AznDevil92

+0

@Mattは上記のコメントのためにあなたにタグを付けると考えました – AznDevil92

答えて

1

問題の1つは、@job_name変数を設定する値がカーソル定義に上書きされていることです。実際にジョブを有効または無効にするわけではないので、カーソル定義は、結果セット内で実際に有効または無効にしたいジョブを返す可能性が低くなります。これは、渡される値が最も高い可能性がある@agnameおよび/ 。

あなたが1つのジョブのみに対処したいので、あなたは本当に、カーソルの定義は必要ありませんが、あなたはまだプライマリレプリカは、それが何かを印刷ん@@SERVERNAME

関連する問題