2012-10-18 3 views
1

SQL Server 2000을 SQL 2000에서 SQL 2008로 업그레이드하는 프로덕션 환경에 코드를 배포하는 중입니다.xp_cmdshell 오류 "파일 이름, 디렉터리 이름 또는 볼륨 레이블 구문이 잘못되었습니다."

일부 데이터를 가져 오는 저장 프로 시저 중 하나에서 신비한 문제가 있습니다. 데이터베이스에서 다음 bcp (성공)를 통해 몇 가지 파일을 만듭니다, 그리고 그것은 몇 가지 이동 명령을 실행하려고하면 그들은 폴더가 확실히 존재하고 서비스가 sysadmin으로 실행되고 있지만 모두 실패합니다. 내가 돌아올 반환 명령 줄 오류가

"The filename, directory name, or volume label syntax is incorrect." 
xp_cmdshell Error Executing "move H:\Transfer\CHAD\Outbound\AllCards\*.* H:\Transfer\CHAD\Outbound\AllCards\Archive\" 

입니다

set @cmd_string = 'move '+ @OutPath_AllCards + '*.* '+ @ArchivePath_AllCards 
delete from @tbl_xp_cmdshell_output 
Insert @tbl_xp_cmdshell_output exec @error_temp = master.dbo.xp_cmdshell @cmd_string 

을이 오류 메시지입니다 :

이 그것을 실행하려고하는 코드는

동일하게 설정 한 UAT 데이터베이스 버전에서 정상적으로 작동합니다.

제안 사항이 있으십니까?

업데이트 :

소스 디렉토리에는 파일이없는 경우 나 오류를 재현 할 수 있습니다. 아마도 원본 디렉토리에 파일이 있어야한다고 생각하지만 bcp가 작성하기 전에 지연이 있는지 궁금합니다. 이동을 실행하면 아직 존재하지 않습니다. 어떤 아이디어?

+0

xp_cmdshell을 사용하여 b) sysadmin 권한으로 서비스 계정을 실행하는 중대한 보안 허점을 알고 있습니까? 전략을 다시 방문하겠습니다! –

+0

나는 ' t 문제가 누락 된 따옴표라고 생각하면 두 번째 출력이 더 낮아지고 그 결과가 결과 테이블에서 파싱됩니다. xp_cmdshell의 위험을 알고 있습니다. 물론,하지만 때로는해야합니다 – jazza1000

+0

죄송합니다, 내 질문을 편집 할 수없는 것, 그래서 내가 코멘트로 넣어 것입니다 - 나는 소스 디렉토리에 파일이없는 경우 오류를 재현 할 수 있습니다. 아마 거기에 있어야한다고 생각 소스 디렉토리에있는 파일은 있지만 bcp가 작성하기 전에 지연이 있는지 궁금합니다. 이동을 실행하면 아직 존재하지 않습니다. 어떤 아이디어입니까? – jazza1000

답변

0

OK, 바보 같은 프로그래머 (나 및 다른 사람) 증후군의 조금 여기.

이동 c : \ Source *. * c : \ dest 문을 실행할 때 소스에 파일이 없기 때문에 오류가 발생하면 오류가 발생합니다 ("파일 이름, 디렉터리 이름 또는 볼륨 레이블 구문이 올바르지 않습니다. ").

코드는 이전 실행 파일이 존재한다고 추정하므로 새 파일을 bcping하기 전에 코드를 제거합니다. 이전에 생각한 것처럼 bcp가 처음에는 발생하지 않습니다.

작업의 첫 번째 실행시 이전 실행 파일이 존재하지 않으므로 오류가 발생했습니다.

그래서 해결책은 이동을 시도하는 것보다는 폴더에서 복사를 수행하는 것입니다.

0

데이터베이스 서버 (귀하의 경우에는 SQL Server)에서 외부 OS 명령을 호출하면 로컬 컴퓨터가 로컬 컴퓨터가 아닌 데이터베이스 서버가됩니다.

특정 예제에서 H : 드라이브를 언급했듯이이 드라이브는 네트워크 매핑 드라이브 (사용자 홈 폴더가있는 드라이브)라고 가정합니다. 그러나이 매핑이 UAT 데이터베이스 서버에는 있지만 PROD에는 없습니다. DEV 또는 UAT 서버가 다른 사람의 로컬 컴퓨터에있을 때, 그리고 소프트웨어가 다음 배포 단계로 옮겨지면 이상하게 잘못되기 시작합니다.

DOS의 경우와 달리 UNC 경로를 사용하는 것이 훨씬 안전합니다 (이중 백 슬래시가있는 경우). 이렇게하면 어디서든 드라이브 매핑에 대한 독립성을 확보 할 수 있습니다.

그러나 저는 개인적으로 데이터베이스 엔진에 OS 호출을 포함시키는 것을 좋아하지 않습니다. 필자는 저장 프로 시저 (isql 또는 osql 또는 sqlplus를 통해)를 호출 한 다음 다른 실행 파일을 실행하는 쉘 스크립트 (UNIX) 또는 명령 스크립트 (Windows)를 선호합니다. BCP를 사용하면 저장 프로 시저에서 실행하는 것의 이점이 나타나지 않습니다. BCP가 자체 연결을 열어 놓기 때문에 여전히 로컬 임시 테이블을 사용할 수 없습니다.

또한 사람들이 작업의 성공 여부를 확인하지 않아도되는 소스 코드를 자주 보게됩니다. BCP를 사용하면 성공했는지 여부를 확인하는 데 많은 노력이 필요합니다 (항상 0을 반환하고 isql, osql, sqlplus 등을 사용하여 같은 이야기를 반환합니다). 오류 파일을 확인하고 그것이 비 었음을 확인하기 위해 비어 있는지 확인해야합니다. 이 모든 것은 저장 프로 시저에 적합하지 않습니다. 물론, 당신은 수표를위한 또 다른 실행 파일을 시작할 수 있지만 제 의견으로는, 이것은 올바른 방법이 아닙니다. 데이터베이스 서버는 데이터베이스 운영을위한 것으로, 전체 애플리케이션 실행을위한 것이 아닙니다.

여전히 xp_cmdshell을 포기하고 싶지 않다면 저의 주위에 일반적인 래퍼로 저장 프로 시저를 만드는 것이 좋습니다. 데이터베이스 공급자를 변경하기로 결정한 경우 훨씬 적은 고통으로 마이그레이션 할 수 있습니다.