Ошибка выполнения SQL-агента SQL с пакетом SSIS для доступа к DB
У меня есть пакет SSIS, который запускает задачу script (в основном, и несколько других вещей). Задача script подключается к базе данных Access с использованием соединения OleDB. Это соединение Microsoft Jet 4.0. У меня установлены драйверы. Но он не будет запущен в SQL Agent через прокси-аккаунт. Он будет отлично работать непосредственно из Visual Studio и из хранилища пакетов. Фактически, он отлично работает в обоих этих местах, когда я вхожу в систему как специальная учетная запись, к которой привязан прокси. Но когда я запускаю через агента SQL Server, я получаю страшную ошибку "Unspecifed Error" OleDbException.
Соответствующий код из задачи script:
// class field
private string accessConnectionStringTemplate = "Data Source=\"{0}\";Provider=Microsoft.Jet.OLEDB.4.0;";
// in method that connects to database
Print(file, "Connection string: " + string.Format(accessConnectionStringTemplate, file.FileName));
// outputs: Data Source = "\Path\To\File";Provider=Microsoft.Jet.OLEDB.4.0"
using(access = new OleDbConnection(string.Format(accessConnectionStringTemplate, file.FileName))) {
access.Open();
// other code
}
Сообщения об ошибках через историю работы агента SQL:
Started: 12:35:10 PM
Error: 2016-11-03 12:35:33.51
Code: 0x00000000
Source: Import Files Main
Description: Exception: Unspecified error
End Error
Error: 2016-11-03 12:35:33.51
Code: 0x00000000
Source: Import Files Main
Description: at System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection)
at System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionInternal.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.OleDb.OleDbConnection.Open()
at ST_cc0028a4b56242909c2eae546a807995.csproj.ScriptMain.ImportFile(AccessFile file, DateTime startRecordDate, DateTime endRecordDate, List`1 accessTables, Boolean includeTransactionTables, List`1 specifiedTableList)
at ST_cc0028a4b56242909c2eae546a807995.csproj.ScriptMain.Main()
End Error
Error: 2016-11-03 12:35:33.51
Code: 0x00000006
Source: Import Files
Description: The script returned a failure result.
End Error
Некоторые вещи, о которых я убедился:
- Драйверы доступа установлены и работают на сервере, на котором включен Агент SQL. Я проверил это, запустив пакет в VS как для моей учетной записи, так и для прокси-аккаунта без каких-либо проблем.
- У учетной записи proxy есть доступ к соответствующему файлу. Опять же, проверяется путем входа на сервер в качестве учетной записи прокси. Файл находится в сетевом ресурсе, но путь указан как UNC-путь.
- У учетной записи прокси есть доступ к другим базам данных, которые являются частью этой операции, чтобы исключить любые другие потенциальные источники ошибок.
- Запуск пакета из хранилища пакетов (через SSMS), так как работает моя учетная запись и учетная запись прокси. Я сделал это на сервере базы данных, чтобы убедиться.
В других вопросах, которые я видел в Интернете по этому поводу, обычно это проблема с драйверами. В этом случае я не уверен, как это может быть.
Я рад предоставить дополнительную информацию, чтобы помочь другим диагнозам. Я сам совершенно не уверен, почему это не работает.
Ответы
Ответ 1
Оказывается, проблема заключалась в том, что поставщик Jet пытался написать в временный каталог пользователя SQL Agent, хотя задача выполнялась с олицетворением как другой пользователь. Это, как представляется, является особенностью системы олицетворения Windows, которая не изменяет профиль пользователя, а только токен пользователя. Я закончил с этим кодом:
var tempPath = Path.GetTempPath().Replace("\\SQLSERVERAGENT\\", "\\" + Environment.UserName + "\\");
Environment.SetEnvironmentVariable("TEMP", tempPath);
Environment.SetEnvironmentVariable("TMP", tempPath);
Это не идеальный, но он работает. Это означает, что мне не нужно предоставлять разрешения для временного каталога SQL Agent. Только этот код должен измениться.
К сожалению, похоже, что нет способа изменить, где драйвер ODBC помещает свои временные файлы.
EDIT: У меня также была эта проблема с обычным пакетом на основе потока данных с источником Excel. В этом случае у меня не было выбора, кроме как предоставить доступ к каталогу temp SQL Agent для моей учетной записи пользователя прокси. Если я смогу придумать обходной путь, я отправлю его.
Ответ 2
Я бы предложил попробовать несколько вещей:
-
Попробуйте выполнить пакет с режимом cmd, то есть с помощью синтаксиса dtexce.exe
от SQL Agent (с использованием как 32-битной, так и 64-битной опций).
-
Добавьте учетную запись службы (Account SQL Agent) в DCOM component for Integration Service
. Если вам разрешено, измените учетную запись службы агента SQL на учетную запись Proxy (для тестирования).
-
Сделайте все, используя учетную запись Proxy, разворачивайте пакет, используя учетную запись Proxy, и сделайте владельца задания учетной записью Proxy (в SQL Agent). Создайте задание с помощью учетной записи прокси.
-
Проверьте окно event viewer
, если у вас есть какие-либо ошибки, связанные с учетной записью прокси-сервера или учетной записи службы SQL Agent.
-
Если вы используете SQL Server 2012 или выше, разверните пакет, попробуйте его с помощью каталога служб Integration Services.