나는이에 자신을 일하고 있었고, 나는 그것이 쉬운 일이 아닙니다 말할 수 JT.
먼저 JT에 의한 회신을 처리하기 위해 SSDT에있는 선언적 업데이트 기법을 사용하는 경우에도 "버전"을 삭제할 수 없습니다. SSDT는 소스 스키마를 모든 대상 스키마로 이동하는 "꽤 괜찮은"작업 (모든 스위치와 잡다한 점을 알고 있어야 함)을 수행합니다. 실제로이 작업을 직접 수행 할 필요는 없지만 " 데이터 모션 "(적어도 내가 볼 수있는!). 따라서 DBProj와 마찬가지로 사전/사후 스크립트에서 자신의 장치로 이동했습니다. 데이터 모션 스크립트는 알려진 시작 및 끝 스키마 상태에 의존하기 때문에 DB의 버전 관리를 피할 수 없습니다. 따라서 "데이터 동작"스크립트는 스키마의 버전이있는 스냅 샷에 적용되어야합니다. 즉, v1에서 v8으로 임의로 DB를 업데이트 할 수 없으며 데이터 모션 스크립트 v2에서 v8이 작동 할 것으로 기대할 수 있습니다 (아마, v1 데이터 모션 스크립트 필요).
슬프게도 통합 시나리오에서이 시나리오를 처리 할 수있는 SSDT 게시의 메커니즘을 볼 수 없습니다. 즉, 자신의 scafolding을 추가해야합니다.
첫 번째 트릭은 데이터베이스 (및 SSDT 프로젝트) 내에서 버전을 추적하는 것입니다. 나는 DBProj에서 트릭을 사용하기 시작했고 SSDT로 가져 왔고 몇 가지 조사를 한 후에 다른 사람들도 이것을 사용하고있는 것으로 나타났습니다. DB 확장 속성을 데이터베이스 자체에 적용 할 수 있습니다 ("BuildVersion"또는 "AppVersion"또는 이와 비슷한 이름으로 지정). 버전 값을 적용합니다. 그런 다음 SSDT 프로젝트 자체에서이 확장 속성을 캡처 할 수 있으며 SSDT는이 속성을 스크립트로 추가합니다 (확장 속성이 포함 된 게시 옵션을 확인할 수 있음). 그런 다음 SQLCMD 변수를 사용하여 현재 패스에 적용되는 소스 및 대상 버전을 식별합니다.원본 (프로젝트 스냅 샷)과 대상 (업데이트 할 대상 db) 간의 버전 차이를 확인하면 적용해야하는 모든 스냅 샷을 찾을 수 있습니다. 안타깝게도 에서 SSDT 배포를 수행하는 것이 까다로 우며,이를 빌드 또는 배포 파이프 라인으로 옮겨야 할 것입니다. (우리는 TFS 자동화 된 배포를 사용하고 이에 대한 사용자 지정 작업이 있습니다.)
다음 장애물은 스키마의 스냅 샷과 관련 데이터 모션 스크립트를 유지하는 것입니다. 이 경우 스크립트를 가능한 한 멱등수로 만드는 것이 좋습니다. 즉, 부작용없이 스크립트를 재실행 할 수 있습니다. 한 번만 실행해야하는 스크립트에서 안전하게 다시 실행할 수있는 스크립트를 분리하는 데 도움이됩니다. 정적 참조 데이터 (사전 또는 조회 테이블)를 사용하여 동일한 작업을 수행합니다. 즉, 참조 데이터를 동기화 상태로 유지하는 MERGE 스크립트 라이브러리 (테이블 당 하나)가 있으며이 스크립트는 게시물에 포함됩니다 -deployment scripts (SQLCMD : r 명령을 통해). 여기서 중요한 점은 은 이러한 참조 테이블에 서로 FK 참조가있는 경우 올바른 순서로 실행해야한다는 것입니다. 이 스크립트를 주 배포 후 스크립트에 순서대로 포함 시키며 이러한 스크립트를 생성하는 도구를 만든 다음 종속성 순서를 해결하는 데 도움이됩니다. 정적 참조 데이터의 현재 상태를 캡처하기 위해 "버전"을 닫은 상태에서이 생성 도구를 실행합니다. 모든 다른 데이터 모션 스크립트는 기본적으로 특수한 경우가 될 것이며 대부분 단일 용도로만 사용됩니다. 이 경우 db build/app 버전에 대해 IF 문을 사용하거나 각 스냅 샷 패키지를 만든 후 1 시간 스크립트를 지울 수 있습니다.
SSDT는 FK 검사 제약 조건을 해제하고 배포 후 스크립트를 실행 한 후에 만 다시 활성화한다는 것을 기억하십시오. 예를 들어 새로운 null이 아닌 필드를 채울 수있는 기회를 제공합니다. (그런데이 옵션을 사용하면 null이 아닌 열에 대한 임시 "스마트"기본값을 생성해야합니다.) 그러나 FK 검사 제약 조건은 스키마 변경으로 인해 SSDT가 다시 작성하는 테이블에 대해서만 비활성화됩니다. 다른 경우에는 데이터 모션 스크립트가 점검 제약 불만을 피하기 위해 올바른 순서로 실행되는지 (또는 스크립트에서 수동으로 비활성화/다시 활성화해야하는지) 책임을집니다.
DACPAC은 기본적으로 스냅 샷이기 때문에 DACPAC이 도움이 될 수 있습니다. 스키마 (프로젝트의 빌드 출력과 유사)를 설명하는 XML 파일이 여러 개 있지만 프로젝트를 만든 순간 정시에 고정됩니다. 그런 다음 SQLPACKAGE.EXE 또는 배포 공급자를 사용하여 해당 패키지 스냅 샷을 게시 할 수 있습니다. DACPAC 버전 관리 방법을 "등록 된"데이터 응용 프로그램과 더 관련이 있기 때문에 파악하지 못했습니다. 따라서 우리는 자체 버전 관리 체계를 고수하고 있지만 DACPAC 파일 이름에 자체 버전 정보를 넣습니다.
내가 제공 할 결론적 인 사례가 더 있었으면 좋겠다.하지만 여기서도 문제를 해결하고 있습니다.
SSDT에 대해 정말 짜증 나는 점 중 하나는 DBProj와 달리 현재 확장이 불가능하다는 것입니다. 많은 다른 것들에서 DBProj보다 훨씬 훌륭하게 작업을 수행 할 수 있지만 문제를 해결하기위한 사전/사후 스크립트의 일부 방법을 찾을 수 없다면 기본 동작을 재정의 할 수 없습니다. 현재 해결해야 할 문제 중 하나는 수천만 개의 레코드가있을 때 CCDR (테이블 업데이트)을 다시 만드는 기본 방법이 실제로 악취를내는 것입니다.
- UPDATE : 나는이 게시물을 언젠가는 보지 못했지만 최근에 활동적 이었으므로 몇 가지 중요한 메모를 추가 할 것입니다. VS2012를 사용한다면 2013 년 6 월 SSDT 이제 데이터 비교 도구가 내장되어 있고 확장 점도 제공됩니다. 즉, 프로젝트에 대한 Build Contributors와 Deployment Plan Modifiers를 포함 할 수 있습니다.
스키마 비교 기능은 스키마를 동기화 상태로 유지하는 데 유용 할 수 있습니다. [링크 1] (http://msdn.microsoft.com/en-us/library/dd193250 (v = vs.100) .aspx) 및 링크 2 http://msdn.microsoft.com/en-us/library /aa833202(v=vs.80).aspx – Keith
스키마 비교 도구는 훌륭하지만 어떤 방식 으로든 데이터를 지원하지는 않습니다. 특정 스키마를 변경하려면 데이터 보존 및 마이그레이션을위한 사용자 지정 노력이 필요하며 스키마 비교 도구는이를 지원하지 않습니다. 이것이 바로 이런 상황에 도움이되는 사전 및 사후 배포 스크립트가 존재하는 이유입니다. –
프로젝트의 스냅 샷을 고려하여 특정 순서로 스냅 샷을 릴리스 할 수 있습니다. 스냅 샷 v1, v2, v3 등 릴리스 패키지가있을 때 아무 것도 잃지 않도록 순서대로 적용하십시오. 데이터베이스의 테이블을 쿼리하여 "현재"버전을 파악하고 배치 또는 powershell 스크립트를 통해 v + 1로 시작할 수 있습니다. 배포 후 스크립트는 테이블에서 해당 버전 설정을 처리 할 수 있습니다. –