SQL Server 2016 SP1 + CU8 Instalado no Windows Server 2016 Standard Edition.
Tudo estava funcionando bem por um tempo e eu consegui criar bancos de dados até que, por algum motivo sem que eu soubesse, um problema de permissões apareceu nos meus volumes montados.
Msg 5123, Level 16, State 1, Line 1
CREATE FILE encountered operating system error 5(Access is denied.)
while attempting to open or create the physical file
'D:\MSSQL13.MSSQLSERVER\MSSQL\Data\UserDB\test.mdf'.
Msg 1802, Level 16, State 4, Line 1
CREATE DATABASE failed. Some file names listed could not be created.
Check related errors.
A pasta D:\MSSQL13.MSSQLSERVER\MSSQL\Data\UserDB é na verdade um volume montado como uma pasta dentro do diretório D:\MSSQL13.MSSQLSERVER\MSSQL\Data.
Eu pesquisei por horas e todos os links continuaram falando sobre propriedade e icacls e takecontrol, mas esse não é o problema aqui. Quero deixar claro que a conta de serviço que executa o SQL Server nesta instância tem CONTROLE TOTAL sobre este volume montado e o que está acima dele também.
Verifiquei o Acesso Efetivo para a conta de serviço e ela concedeu explicitamente o controle TOTAL.
Minha suspeita é que tenha algo a ver com a concessão de permissões para uma pasta montada como um volume em vez de um disco. Isso porque em meus testes, consigo criar um banco de dados com seus arquivos na raiz de D:\ sem problemas. D:\ também é um volume que usa o mesmo tipo de armazenamento.
Além disso, meu próprio usuário tem controle total, mas quando tento criar um arquivo, recebo esse aviso.
Curiosamente, posso adicionar uma pasta à pasta/volume do UserDB sem dificuldade.
Como faço para que este volume, montado como uma pasta na unidade D:\ seja gravável para a conta MSSQL?
A criação de arquivos de dados do SQL Server na raiz de um volume é problemática devido a problemas de permissões. Eu sempre recomendo criar uma pasta na raiz do volume e depois colocar os arquivos de dados dentro dessa pasta (essa também é uma recomendação da Microsoft). Definir e verificar permissões na raiz da unidade nem sempre funciona da mesma forma que definir permissões no nível da pasta.
Ao montar o volume como uma unidade com letras, isso significa que seus arquivos de dados nunca entrariam diretamente,
D:\
mas sim emD:\SomeFolder\
. No seu caso, você está usando um ponto de montagem ondeUserDb
é a raiz do volume. Eu sugiro criar uma pasta adicional dentro do seu ponto de montagem:D:\...\Data\UserDb\SomeFolder\
. Em seguida, defina permissões para garantir que a conta de serviço do SQL Server tenha controle total sobre oSomeFolder
diretório.Observe que esta orientação da Microsoft ainda é verdadeira:
E também este conselho mais explícito para arquivos de banco de dados especificamente:
Colocar arquivos diretamente na raiz do ponto de montagem significa que você terá que gerenciar permissões diretamente em cada arquivo para garantir que estejam corretos. No caso de criar um novo banco de dados (de backup ou de modelo), isso pode ser problemático. Como resultado, é uma prática recomendada nunca colocar arquivos na raiz do ponto de montagem ou da unidade. Você pode fazê-lo funcionar, mas não é suportado e não é uma boa ideia.
Esteja ciente de que o SQL Server 2016 relata que as unidades montadas não têm espaço suficiente ao propagar um banco de dados AlwaysOn - mas funciona bem, se você continuar!