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.