No arquivo de log de erros do SQL Server encontrei as seguintes linhas:
2018-02-22 14:10:58.95 spid17s Starting up database 'msdb'.
2018-02-22 14:10:58.95 spid16s Starting up database 'ReportServer'.
2018-02-22 14:10:58.95 spid18s Starting up database 'ReportServerTempDB'.
2018-02-22 14:10:58.95 spid19s Starting up database 'XYZ'.
Se eu verificar o status do banco de dados XYZ antes desse horário, ele está ONLINE
usando a seguinte instrução:
SELECT state_desc FROM sys.databases WHERE name='XYZ'
...mas quando tento me conectar a esse banco de dados usando um aplicativo C#, ele não consegue se conectar ao banco de dados.
O erro é:
Falha no login para o usuário 'asd'.
Motivo: Falha ao abrir o banco de dados explicitamente especificado.
Eu tentei três usuários diferentes (usuário do Windows, sa, usuário do SQL Server definido para o aplicativo). O problema acontece quando executo o aplicativo na inicialização do SO, mas se eu iniciá-lo manualmente após a inicialização, nenhum erro acontece, então acho que todas as configurações do SQL Server e do firewall estão corretas.
Eu também verifiquei antes disso se o status do serviço está em execução.
O que mais devo verificar para garantir que o banco de dados esteja realmente online e pronto para consultas?
Estou procurando uma chave que me diga que não há problema em consultar o banco de dados, em vez de atrasar por um tempo (mesmo não com base em um motivo claro).
Pensei em verificar o log de erros para o texto "Iniciando o banco de dados 'XYZ'", mas isso significa que tenho que adicionar uma configuração para o aplicativo para o caminho do log de erros do SQL Server. Significa também ler o arquivo muitas vezes até encontrar essa frase.
O banco de dados SQL Server está pronto para aceitar consultas assim que:
não retorna
NULL
.Da documentação para
DATABASEPROPERTYEX
(Transact-SQL) :Os bancos de dados do SQL Server são iniciados, mas precisam analisar o log de transações para avançar e retroceder as transações. Esse processo pode levar de milissegundos a horas (até dias!) no caso de uma transação de longa duração, muitos (pense em milhares) de bancos de dados de usuários ou bancos de dados com muitos (pense em dezenas de milhares) de arquivos de log virtuais.
Se você deseja que o aplicativo entre apenas quando a recuperação estiver concluída e o banco de dados estiver pronto, faça com que o aplicativo tente novamente sua conexão.
Se você deseja que o aplicativo possa entrar no SQL Server imediatamente, mas talvez ainda não consiga executar nenhuma consulta, defina seu banco de dados padrão como TempDB em vez de um banco de dados de usuário. Provavelmente estará online imediatamente, mesmo quando os bancos de dados do usuário não estiverem disponíveis.