Deixe-me explicar o meu caso.
Eu tenho uma montagem com arquivos de banco de dados no meu PC local. Eu anexo o banco de dados (a partir desta montagem). E, em seguida, feche esta montagem (em outras palavras, eu anexe o db e excluo os arquivos db). Então eu tenho o banco de dados sem arquivos. E qualquer ALTER
consulta me dá algo assim:
Database 'TestTableDatabase2005' cannot be opened due to inaccessible files or insufficient memory or disk space. See the SQL Server errorlog for details.
Basicamente eu preciso desanexar um banco de dados, mas nessa situação esse banco de dados só pode ser excluído (ou reparado, mas não é o meu caso). A eliminação do banco de dados funciona perfeitamente:
DROP DATABASE [TestTableDatabase2005]
Mas meu objetivo é saber qual estado esse banco de dados possui. E aqui eu tenho problema. Consulta:
SELECT state
FROM sys.databases
WHERE name = N'TestDB'
Dá-me ONLINE
(não é verdade). Mas assim que executo por exemplo este script (claro que termina com erro):
ALTER DATABASE [TestDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
Msg 5120, Level 16, State 101, Line 10
Unable to open the physical file "C:\MOUNT\b4c059e8-3ba6-425f-9a2a-f1713e7719ca\TestDB.mdf". Operating system error 3: "3(The system cannot find the path specified.)".
File activation failure. The physical file name "C:\MOUNT\b4c059e8-3ba6-425f-9a2a-f1713e7719ca\TestDB_log.ldf" may be incorrect.
File activation failure. The physical file name "C:\MOUNT\b4c059e8-3ba6-425f-9a2a-f1713e7719ca\TestDB_log-2.ldf" may be incorrect.
Msg 5181, Level 16, State 5, Line 10
Could not restart database "TestDB". Reverting to the previous status.
Msg 5069, Level 16, State 1, Line 10
ALTER DATABASE statement failed.
o estado do meu 'TestDB' será alterado em RECOVERY_PENDING
.
Você tem alguma idéia de como posso verificar se esses arquivos db são inacessíveis ou não? Ou posso ter a oportunidade de atualizar as informações do sql sobre esse banco de dados?
PS A seguinte consulta diz que os arquivos têm tamanho real.
SELECT DB_NAME(database_id) AS DatabaseName,
Name AS Logical_Name,
Physical_Name, (size*8)/1024 SizeMB
FROM sys.master_files
WHERE DB_NAME(database_id) = N'TestDB'
DatabaseName Logical_Name Physical_Name SizeMB
------------ ------------ ----------------------------------------------------------------- -------
TestDB TestDB C:\MOUNT\b4c059e8-3ba6-425f-9a2a-f1713e7719ca\TestDB.mdf 3
TestDB TestDB_log C:\MOUNT\b4c059e8-3ba6-425f-9a2a-f1713e7719ca\TestDB_log.ldf 3
TestDB TestDB-2_log C:\MOUNT\b4c059e8-3ba6-425f-9a2a-f1713e7719ca\TestDB_log-2.ldf 3
Se o seu sistema de arquivos está caindo, isso é um grande problema. E se seu banco de dados estiver no meio da confirmação de uma transação? Isso pode causar corrupção e potencial perda de dados. Esta seria minha primeira reação.
Se isso for um problema apenas no seu sistema de teste e você tiver verificado que a falha do sistema de arquivos subjacente está localizada (o IE definitivamente não afeta os sistemas de produção), minha sensação é que um trabalho do SQL Agent com a etapa 1 configurada para verificar os arquivos físicos em disco poderia fazer o trabalho.
A etapa 1 pode consistir em algo como o seguinte powershell:
O código acima gerará um erro se o arquivo na variável $path não existir.
O passo 1 em caso de falha passaria para o passo 2, mas em caso de sucesso deixaria o trabalho relatando sucesso. O passo 2 seria então qualquer ação que você deseja tomar.
Finalmente, encontrei o que realmente preciso. Posso verificar se o arquivo específico existe ou não pelo sql server: