2016-11-03 4 views
14

У меня есть пакет SSIS, который запускает задачу сценария (в основном, и несколько других вещей). Задача сценария подключается к базе данных Access с использованием соединения OleDB. Это соединение Microsoft Jet 4.0. У меня установлены драйверы. Но он не будет запущен в SQL Agent через прокси-аккаунт. Он будет отлично работать непосредственно из Visual Studio и из хранилища пакетов. Фактически, он отлично работает в обоих этих местах, когда я вхожу в систему как специальная учетная запись, к которой привязан прокси. Но когда я запускаю через агента SQL Server, я получаю страшную ошибку «Unspecifed Error» OleDbException.Сбой задания агента SQL с пакетом SSIS для доступа к DB

Соответствующий код от задачи сценария:

// 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), так как работает моя учетная запись и учетная запись прокси. Я сделал это на сервере базы данных, чтобы убедиться.

В других вопросах, которые я видел в Интернете по этому поводу, обычно это проблема с драйверами. В этом случае я не уверен, как это может быть.

Я рад предоставить дополнительную информацию, чтобы помочь другим диагностировать. Я сам совершенно не уверен, почему это не работает.

+0

Нечетный, файл открыт или заблокирован каким-либо образом? – Siyual

+1

@Siyual: это не так. И так как я могу запустить его за пределами SQL Agent, это не похоже на проблему. Я полагаю, что возможно, кто-то открывает его, когда я запускаю работу агента и ни в какое другое время, но это кажется маловероятным. – siride

+0

Ну, вот, есть swag: номинально аргументы строки подключения разделены точкой с запятой и не любят кавычки вокруг аргументов - даже аргументы со встроенными записями. Просто попробуйте вывести котировки. Разве это не было бы кикером? – Clay

ответ

6

Оказывается, что проблема заключалась в том, что поставщик Jet пытается написать временную директорию пользователя SQL Agent, даже если задача была запускаемый с олицетворением как другой пользователем. Это, как представляется, является особенностью системы олицетворения Windows, которая не изменяет профиль пользователя, а только токен пользователя. Я закончил с этим кодом:

var tempPath = Path.GetTempPath().Replace("\\SQLSERVERAGENT\\", "\\" + Environment.UserName + "\\"); 
Environment.SetEnvironmentVariable("TEMP", tempPath); 
Environment.SetEnvironmentVariable("TMP", tempPath); 

Это не идеал, но он работает. Это означает, что мне не нужно предоставлять разрешения для временного каталога SQL-агента. Только этот код должен измениться.

К сожалению, по-видимому, нет возможности изменить, где драйвер ODBC помещает свои временные файлы.

EDIT: У меня также была проблема с обычным пакетом с потоком данных с источником Excel. В этом случае у меня не было выбора, кроме как предоставить доступ к временному каталогу агента SQL для учетной записи моего прокси-пользователя. Если я смогу придумать обходной путь, я отправлю его.

1

Я бы предложил попробовать несколько вещей:

  1. Попробуйте выполнить пакет с CMD режиме т.е. с использованием синтаксиса dtexce.exe от агента SQL (с использованием как 32-битные и 64-битный вариант).

  2. Добавьте учетную запись службы (Account SQL Agent) в DCOM component for Integration Service. Если вам разрешено, измените учетную запись службы агента SQL на учетную запись Proxy (для тестирования).

  3. Выполняйте все с помощью учетной записи прокси-сервера. Разверните пакет, используя учетную запись прокси-сервера, и сделайте владельца задания учетной записью Proxy (в SQL-агенте). Создайте задание с помощью учетной записи Proxy.

  4. Проверьте, есть ли у вас ошибка, связанная с вашей учетной записью прокси-сервера или учетной записью агента SQL.

  5. Если вы используете SQL Server 2012 или выше, разверните пакет, попробуйте его с помощью каталога служб Integration Services.

+0

Пакет запущен и выполняет другие действия, он просто не может открыть соединение с этой базой данных Access как один из своих промежуточных шагов. Я могу попробовать сделать некоторые из этих вещей, но они, похоже, в основном не имеют отношения к моей проблеме. – siride

+0

Ваш пакет работает только из SQL Agent Job. Таким образом, можно сосредоточиться на настройках учетной записи службы SQL Agent, которые могут помочь в доступе/доступе. Это не похоже на проблему с учетной записью прокси (согласно вашему описанию). – p2k

+0

Он работает (предположительно) как моя учетная запись прокси, а не как учетная запись службы SQL Agent, которую я никогда не использую. – siride