2016-11-03 8 views
14

스크립트 작업을 실행하는 SSIS 패키지가 있습니다 (대부분 다른 점이 많습니다). 스크립트 태스크는 OleDB 연결을 사용하여 Access 데이터베이스에 연결합니다. 이것은 Microsoft Jet 4.0 연결입니다. 나는 드라이버를 설치했다. 그러나 프록시 계정을 통해 SQL Agent에서 실행되지는 않습니다. Visual Studio 및 패키지 저장소에서 직접 올바르게 실행됩니다. 사실 프록시가 연결된 특수 계정으로 로그인 할 때 두 위치 모두에서 정상적으로 실행됩니다. 그러나 SQL Server Agent를 통해 실행하면 "Unspecifed Error"OleDbException이 발생합니다. 스크립트 작업에서SSIS 패키지에서 Access DB에 대한 SQL Agent 작업이 실패했습니다.

관련 코드 : SQL 에이전트 작업 기록을 통해

// 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 
} 

오류 메시지 :

  • 액세스 :

    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 Agent가있는 서버에서 작동합니다. VS에서 내 계정과 프록시 계정으로 패키지를 실행하여 문제가 없는지 확인했습니다.

  • 프록시 계정에 문제의 파일에 대한 액세스 권한이 있습니다. 다시 서버에 프록시 계정으로 로그인하여 확인합니다. 파일은 네트워크 공유에 있지만 경로는 UNC 경로로 지정됩니다.
  • 프록시 계정은이 작업의 일부인 다른 데이터베이스에 액세스 할 수 있으므로 다른 잠재적 인 오류 출처를 배제합니다.
  • SSMS를 통해 패키지 저장소에서 패키지를 실행하면 내 계정과 프록시 계정이 모두 작동합니다. 데이터베이스 서버에서이 작업을 수행했습니다.

인터넷에 관한 다른 질문으로는 일반적으로 드라이버 문제입니다. 이 경우 어떻게 될지 확신 할 수 없습니다.

다른 진단 정보를 제공해 주시면 기꺼이 도와 드리겠습니다. 나는 이것이 왜 효과가 없는지에 대해 완전히 확신 할 수 없다.

+0

이상한 파일이 열려 있거나 잠겨있습니까? – Siyual

+1

@Siyual : 그렇지 않습니다. 그리고 SQL Agent 외부에서 실행할 수 있기 때문에 문제가되지 않습니다. 에이전트 작업을 실행할 때 다른 사람이 바로 열 수있는 사람이 있다고 생각되지만 가능성은 희박합니다. – siride

+0

글쎄 - 여기에 한 가지만 있습니다. 명목상으로, 연결 문자열 인수는 세미콜론으로 구분되며 인수를 따옴표로 묶지 않습니다. 심지어 공백이 포함 된 인수도 있습니다. 따옴표를 사용 해보십시오. 그게 키커가 아닐까요? – Clay

답변

6

이 문제가 제트 공급자가 작업이 다른 사용자로 가장으로 실행되는지에도 불구하고, SQL 에이전트 사용자의 임시 디렉터리에 쓰기를 시도하는 것을 것을 밝혀졌습니다. 이것은 사용자 프로필을 변경하지 않고 사용자 토큰 만 변경하는 Windows 가장 시스템의 기능인 것으로 보입니다. 나는이 코드로 끝났다 :

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

그것은 이상적이지만 작동한다. 즉, SQL Agent의 임시 디렉터리에 대한 사용 권한을 부여 할 필요가 없습니다. 이 코드 만 변경해야합니다.

슬프게도 ODBC 드라이버가 임시 파일을 저장하는 위치를 변경할 방법이없는 것처럼 보입니다.

편집 : Excel 원본을 사용하는 일반 데이터 흐름 기반 패키지에서도이 문제가 발생했습니다. 이 경우 SQL 프록시의 임시 디렉터리에 대한 액세스 권한을 프록시 사용자의 계정에 부여 할 수 밖에 없었습니다. 거기에 해결 방법을 제시 할 수 있다면 게시 할 것입니다.

1

나는 몇 가지를 시도하는 것이 좋습니다 것입니다 (32 비트 및 64 비트 옵션을 모두 사용) SQL 에이전트에서 dtexce.exe 구문을 사용하여 cmd를 모드 즉 사용하여 패키지를 실행하는

  1. 시도합니다.

  2. 서비스 계정 (SQL 에이전트가 실행중인 계정)을 DCOM component for Integration Service에 추가하십시오. 허용 된 경우 SQL 에이전트 서비스 계정을 프록시 계정 (테스트 용)으로 변경하십시오.

  3. 프록시 계정을 사용하여 모든 것을 수행하십시오. 즉, 프록시 계정을 사용하여 패키지를 배포하고 작업 소유자를 프록시 계정 (SQL 에이전트)으로 만드십시오. 프록시 계정을 사용하여 작업을 만듭니다.

  4. 프록시 계정 또는 SQL 에이전트 서비스 계정과 관련된 오류가있는 경우 event viewer 창을 확인하십시오.

  5. SQL Server 2012 이상을 사용하는 경우 패키지를 배포하려면 Integration Services 카탈로그를 사용하십시오.

+0

패키지가 실행 중이고 다른 작업을 수행 중이므로이 Access 데이터베이스에 대한 중간 단계 중 하나의 연결을 열 수 없습니다. 이 중 일부를 시도해 볼 수는 있지만 내 문제와 관련이없는 것으로 보입니다. – siride

+0

패키지가 SQL 에이전트 작업에서만 실패합니다. 그래서, 권한/액세스와 같은 SQL 에이전트 서비스 계정 설정에 집중할 수 있습니다. 프록시 계정에 문제가없는 것 같습니다 (설명에 따라). – p2k

+0

그것은 결코 사용하지 않는 SQL Agent 서비스 계정이 아니라 내 프록시 계정으로 (아마) 실행 중입니다. – siride