2010-04-14 2 views
0

프로덕션 데이터베이스에서 백업을 복원 한 다음 SQL 스크립트 (예 : ALTER TABLE, INSERT 등)를 자동으로 다시 적용하여 해당 db 스키마를 개발중인 것으로 되돌려 놓아야합니다.프로덕션에서 dev db 복원 : 테이블에 저장된 목록을 기반으로 SQL 스크립트 세트를 실행 하시겠습니까?

소수의 개발자가 많은 스크립트가 있습니다. 그들은 모두 같은 디렉토리에 있지는 않습니다.

현재 나의 계획은 psuedo-system 데이터베이스의 테이블에 전체 파일 시스템 경로가있는 스크립트를 나열하는 것입니다. 그런 다음이 데이터베이스에서 먼저 RESTORE DATABASE를 실행 한 다음 스토어드 프로 시저를 작성하여 스크립트 목록에 대해 커서를 실행하고 각 스크립트에 대한 SQLCMD에 대한 명령 문자열을 작성한 다음 xp_cmdshell을 사용하여 각 스크립트에 대해 해당 SQLCMD 문자열을 실행하십시오.

커서 -> sqlstring-> xp_cmdshell-> sqlcmd 시퀀스가 ​​나에게 어색함을 느낍니다. 또한 xp_cmdshell을 켜야합니다.

나는 이와 같은 일을 한 유일한 사람이 될 수 없습니다. 서버의 파일 시스템 주위에 흩어져있는 일련의 스크립트를 실행하는 더 깨끗한 방법이 있습니까? 특히, xp_cmdshell을 필요로하지 않는 방법?

답변

1

우선 오프닝과 A- 넘버 - 하나의 중앙 위치에서 모든 데이터베이스 스크립트를 수집하십시오. 어떤 형태의 소스 제어 또는 버전 제어가 가장 좋습니다. 그러면 누가 언제 수정했는지 (diff 도구를 사용하면 다른 것) 이유를 알 수 있습니다. 네트워크에 관한 데이터베이스를 만드는 데 사용 된 코드를 남겨두면 재앙을 피할 수 있습니다.

둘째, 데이터베이스에 대해 스크립트를 실행해야합니다. 즉, 코드를 실행하는 것을 의미하는 누군가 또는 무언가가 필요합니다. SQL Server 내에서이 코드를 실행하면 xp_cmdshell을 사용하여 거의 끝날 것입니다. 대안? 데이터베이스에 대해 스크립트를 실행할 수있는 다른 것을 사용하십시오.

이런 종류의 문제에 대한 현재의 해결책은 텍스트 (.sql) 파일에 스크립트를 저장하고 파일을 소스 제어에 저장하고 실행 순서를주의 깊게 추적하는 것입니다 (예 : CREATE TABLE은 후속 열을 추가하는 ALTER TABLE보다 먼저 실행됩니다. 그런 다음 배치 파일을 가지고 있습니다. 예를 들어 잠시 동안 주변에 있었으므로 대부분의 언어에서이 작업을 수행 할 수있었습니다. SQLCMD (SQL 2005를 사용 중이며 osql을 사용했습니다)를 호출하고이 스크립트를 실행합니다. 필요한 데이터베이스에 대해

"자신 만의 롤"을 시도하고 싶지 않다면이 프로세스를 관리하는 데 도움이되는보다 공식적인 도구가있을 수 있습니다.

+0

나는 버전 제어에 동의하지만 그것은 또 다른 이야기이며 내 결정이 아닙니다. [SQL Server 내에서이 코드를 실행하는 경우 거의 xp_cmdshell을 사용하여 끝납니다.] 나는 그렇게 할 수 있으며 실제로 신경 쓰지 않아도됩니다. 내가 알지 못했던 청결한 또는 더 똑똑한 것을 놓치고 싶지 않았다. – Matt

0

Phillip Kelley가 만든 중앙 집중식 및 소스 제어에 대한 제안 이외에도 .NET에 익숙한 경우 SQL Server SMO (SQL Server Management Objects)를 사용하는 작은 WinForms 또는 WebForms 응용 프로그램을 작성하는 것이 좋습니다. 이 기능을 사용하면 Management Studio에 스크립트를 드롭 한 것처럼 전체 스크립트를 데이터베이스에 전달할 수 있습니다. 따라서 xp_cmdshell 및 sqlcmd가 필요 없습니다. 또 다른 옵션은 파일을 읽고 루프에서 T-SQL 실행 작업을 사용하는 DTS/SSIS 패키지를 만드는 것입니다.

+0

작은 WinForms 앱에 대한 아이디어가 나에게도 발생했습니다. SSIS를 모르거나, 파일을 읽는지 여부를 알 수 없으므로 알 수 있습니다. 답장을 보내 주셔서 감사합니다. 죄송 합니다만 아직 투표 할 수 없습니다. – Matt