Estou tentando executar um BULK INSERT, mas estou recebendo um erro de acesso negado. Até agora tentei o seguinte:
- Eu posso abrir o arquivo da minha máquina
- Estou logado no SQL Server (tentei v2008 R2 e v2016) usando a autenticação do Windows
- Eu tenho permissões de administrador do sistema
- Eu posso
type
o arquivo usando xp_cmdshell (usa a conta de serviço SQL, mas elimina a ideia de que é um firewall) - O caminho é um URL de rede e não uma unidade local
O comando que estou usando é esse:
BULK INSERT ken_temp
FROM '\\network_path\temp\kdf\text_file.txt'
WITH
(
FIELDTERMINATOR = ',', ROWTERMINATOR = '\n'
,ROWS_PER_BATCH = 50000
,MAXERRORS = 10
)
Alguma ideia?
O problema é que:
Você está fazendo login usando a Autenticação do Windows: isso significa que o SQL Server tentará representar sua conta do Windows/Domínio para o acesso ao sistema de arquivos.
Você fez logon diretamente em uma estação de trabalho e, em seguida, conectou-se remotamente ao SQL Server: isso significa que você se conectou ao servidor que executa o SQL Server indiretamente, passando seu token de autenticação de sua estação de trabalho para o servidor que executa o SQL Server.
Você não habilitou a delegação para o SQL Server: isso significa que você está preso ao comportamento padrão de não ter permissão para passar esse token além de 1 etapa do logon direto.
Você está tentando ler um arquivo que existe em um recurso remoto: isso significa que está mais de 1 passo além de onde você fez login diretamente.
É por isso que você pode acessar o arquivo da sua estação de trabalho muito bem. E é por isso que usar
xp_cmdshell
também funciona, pois a conta de serviço está conectada diretamente ao servidor que executa o SQL Server, e o recurso remoto está apenas um passo além.Suspeito que, se você acessasse a área de trabalho remota diretamente no servidor que executa o SQL Server, executasse o SSMS nesse servidor e, em seguida, executasse o
BULK INSERT
, ele seria bem-sucedido. Ou também deve funcionar se você configurar um logon do SQL Server, conceder ao logon a permissão "admin em massa" e, em seguidaEXECUTE AS Login = 'JustReadTheDangFileAlready';
, fazer oBULK INSERT
. Ao executarBULK INSERT
/OPENROWSET (BULK...)
como um logon do SQL Server, não há conta do Windows para representar, portanto, o acesso ao sistema de arquivos é feito usando a conta de serviço, que será comoxp_cmdshell
.Você tem as seguintes opções:
Habilitar Delegação para SQL Server (não lembro se é para o serviço ou a conta, nesse caso pode ser sua conta do Windows que precisa, mas existem guias sobre como configurar isso, que inclui configurar os SPNs) . Acredito que esta seja a escolha preferida/recomendada. Isso permite que o processo encaminhe os tokens de autenticação para recursos removidos do login direto.
Use um logon do SQL Server para esse processo. Não acredito que estou sugerindo isso, mas se você tivesse um logon do SQL Server que estivesse na função de servidor fixa "administrador em massa" OU tivesse a permissão "administrador em massa" correta, você poderia criar o usuário associado para isso Faça login (em um banco de dados apropriado) e coloque o
BULK INSERT
em um procedimento armazenado que foi criado usandoWITH EXECUTE AS 'JustReadTheDangFileAlready'
. Então você pode executar esse proc que deve mascarar que a solicitação estava vindo de uma conta do Windows.Abra as permissões desse arquivo remoto (e talvez também a pasta?). Você pode dar permissão "ler" para "Todos" (e talvez também "ler" ou alguma outra permissão na pasta).
Exclua essa pergunta e use esse "erro" como justificativa para precisar de uma SAN cara que será conectada via cartão HBA e aparecerá como uma unidade local ?. Apenas diga ao CFO: "É realmente o único jeito. A internet disse isso."