Eu criei um pacote SSIS que importa um arquivo do Excel para uma tabela do SQL Server.
O pacote SSIS é executado sem nenhum problema quando o executo localmente em minha máquina, mas quando o executo no servidor em que o pacote será agendado, recebo o erro abaixo (de um arquivo de texto estou gerando erros para usar o log do SSIS).
Depois de pesquisar, as únicas recomendações que encontrei foi definir a propriedade Run64BitRuntime como false, o que fiz, mas ainda sem sorte. Eu duvido que seja isso que está causando meu erro, porque o erro não está especificando nada sobre 64 bits (como foi o caso nos artigos que encontrei).
Eu também pensei que poderia ser que o servidor não tivesse os drivers do Excel apropriados, mas também não acho que seja o caso, porque geralmente a mensagem de erro diria algo sobre os drivers não serem registrados.
Atualmente não tenho acesso remoto ao servidor. Eu só posso enviar o pacote para uma pasta e, em seguida, ele é executado por um aplicativo, portanto, as únicas mensagens de erro que posso ver são as que estão no log de erros de texto que criei.
Código de erro DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER. A chamada do método AcquireConnection para o gerenciador de conexões "Envision" falhou com o código de erro 0xC0209303. Pode haver mensagens de erro postadas antes disso com mais informações sobre por que a chamada do método AcquireConnection falhou.
"Envision" é o nome do meu gerenciador de conexões do Excel.
Eu preencho o caminho do arquivo do Excel e a string de conexão usando expressões.
A expressão da string de conexão se parece com isso:
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+ @[User::SourceFilePath] +";Propriedades Estendidas=\"EXCEL 12.0 XML;HDR=YES\";"
O SSIS Pacakge é executado por um nome de usuário/conta do Windows. Eu acho que pode ser uma conta de serviços da web. (BDS_sprtIIS)
Alguém tem alguma solução ou sugestão de como resolver esse problema do pacote trabalhando apenas na minha máquina local, mas não no servidor real em que o pacote será implantado?
Encontrei a resposta abaixo em outro fórum, poderia ser o que está causando meus problemas? Eles estão basicamente dizendo que o gerenciador de conexões do Excel tenta acessar a pasta temporária dos usuários por algum motivo e, se não tiver acesso a essa pasta, falhará:
Notei também que o driver Microsoft.JET.OLEDB.4.0 tentará ler o diretório temporário abaixo do perfil do usuário logado.
.
... Executamos nossos SQL Agents usando uma conta de domínio de nível inferior e executamos nossos pacotes SSIS usando uma Conta Proxy. Você está correto como Procmon confirmou para mim também. Dei os direitos da Conta Proxy ao diretório temporário do perfil (C:\Documents and Settings\SQLAgentDomainAccount\Local Settings\Temp) e funcionou!
Não estou usando contas SQL Server Jobs ou Proxy. O pacote é simplesmente executado por uma conta do Windows provavelmente através de um script de linha de comando.
A conta do Windows tem acesso ao arquivo, mas não tenho certeza se ela tem acesso à pasta "TEMP" (que nunca faço referência no pacote, então não sei por que precisaria ter acesso a essa pasta) ...
Havia 2 problemas que impediam a execução do pacote no servidor. Abaixo estão os 2 problemas e as soluções que encontrei.
O pacote é executado por um aplicativo que usa o utilitário DTexec de 64 bits por padrão, mas o pacote precisa ser executado usando a versão de 32 bits do utilitário para poder acessar corretamente o arquivo do Excel por meio do gerenciador de conexões do Excel.
Eu criei um pacote SSIS "wrapper" que usa uma tarefa de processo de execução que chama o utilitário DTExec de 32 bits (em vez de 64 bits) e passa o comando para abrir o pacote original.
Também precisei instalar a versão de 32 bits do Microsoft Access Database Engine 2010 Redistributable .
Leitura adicional:
Microsoft.ACE.OLEDB.12.0 não está registrado (Stack Overflow)
Instalar o Access Engine de 32 bits e executar no modo de 32 bits funcionou para mim!