Acabei de atualizar meu ambiente de alta disponibilidade do SQL 2017 para 2019 versão 15.0.4236.7 Tenho os mesmos trabalhos do SQL Agent em ambos os servidores com uma cláusula inicial para determinar se o trabalho deve ser executado (se o servidor for o principal). Isso sempre funcionou no passado, mas eu me deparei com um erro. Agora, o mesmo trabalho no servidor secundário falhará se chamar um procedimento armazenado. Se o trabalho tiver uma seleção embutida em uma tabela que é somente leitura, o trabalho será executado sem problemas, mas o proc gerará um erro informando que "O banco de dados de destino está atualmente....". É como se o procedimento fosse lido antes da execução, enquanto a seleção na linha não fosse lida até que a linha fosse invocada. Aqui está um teste simples que funciona no servidor secundário de 2017, mas não em 2019. Não tenho certeza se é um bug ou um recurso.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
use master;
Declare @AGName varchar(20) = 'MY-SQLAGNAME'
declare @ret bit
SELECT
@ret = count(AGC.name)
FROM
sys.availability_groups_cluster AS AGC
INNER JOIN sys.dm_hadr_availability_replica_cluster_states AS RCS ON RCS.group_id = AGC.group_id
INNER JOIN sys.dm_hadr_availability_replica_states AS ARS ON ARS.replica_id = RCS.replica_id
WHERE
ARS.role_desc = 'PRIMARY' and AGC.name = @AGName and RCS.replica_server_name = @@ServerName
if @ret = 1
begin;
Select 'Shouldt go in here'
select top 1 * from MyDby.dbo.MyTable -- This works
exec MyDb.dbo.AnyProcedure -- This Bombs
end
Recomendo uma mudança no seu processo.
Mova a lógica de verificação primária do procedimento para a primeira etapa do trabalho. Se a etapa falhar, encerre o trabalho relatando sucesso. Dessa forma, nenhuma outra etapa é executada e você não precisa repetir a lógica.
Em vez de consultar o DMV, você pode usar a função sys.fn_hadr_is_primary_replica .
Um banco de dados só pode pertencer a um único AG. Então aqui está um exemplo da lógica do primeiro passo. Então, é claro, você também pode envolvê-lo em um procedimento.