Da es offenbar keine eingebaute Funktionalität gibt mit der man auf einem SQL 2012 Server mit AlwaysOn Availability Groups feststellen kann ob eine Gruppe oder eine DB am aktuellen Server gerade die Primary oder die Secondary Copy hält (was u.a. für Jobs eher wichtig ist weil es ja eher keinen weniger Sinn macht auf der read-only secondary copy herum zu werkeln) habe ich ein wenig recherchiert und folgende zwei custom scalar valued functions sind unten raus gefallen:


CREATE FUNCTION [dbo].[fn_is_availability_database_primary] ( @AVAILABILITYDATABASENAME VARCHAR(255) )
RETURNS BIT
AS
BEGIN
DECLARE @RESULT BIT

IF (select count(*) from sys.availability_databases_cluster 
    where group_id in 
    (select group_id from sys.dm_hadr_availability_group_states 
      where primary_replica=@@SERVERNAME) 
      and database_name=@AVAILABILITYDATABASENAME) = 1
   SET @RESULT=1;
ELSE
   SET @RESULT=0;

RETURN @RESULT;
END

CREATE FUNCTION [dbo].[fn_is_availability_group_primary] ( @AVAILABILITYGROUPNAME VARCHAR(255) )
RETURNS BIT
AS
BEGIN
DECLARE @RESULT BIT;
    IF (select count(*) from sys.dm_hadr_availability_group_states 
        where group_id=(select group_id from sys.availability_groups 
        where name = @AVAILABILITYGROUPNAME) and primary_replica=@@SERVERNAME) = 1
   SET @RESULT=1;
ELSE
   SET @RESULT=0;

RETURN @RESULT;
END

Aufgerufen mit z.B.

IF master.dbo.fn_is_availability_database_primary(DB_NAME())=0
BEGIN
PRINT 'server not primary for availability database, aborting'
RETURN
END

kann man verhindern dass der Job auf der secondary copy failed.