0

데이터베이스를 다시 작성하기 위해 스크립트를 생성 할 때 'Identity'열을 처리하는 방법을 올바르게 조정하는 방법을 알아 내려고 노력했습니다.데이터베이스 복사본 만들기 - 'Identity'사양 사용으로 인해 실패 함

SQL 데이터베이스를 이전 버전으로 '다운 그레이드'해야하기 때문에 스크립트를 생성해야하는 원래 이유가 있습니다. 데이터베이스 (v10.5)의 모든 것이 이전 버전 (v10.0)과 호환된다는 것을 알고 있습니다. 내가 직면 한 문제는 데이터베이스를 복사하는 3 가지 다른 방법 중 하나인데, 항상 원래 ID 필드 (ID)를 유지할 수 없다는 사실과 함께 실패합니다.

모든 테이블에는 첫 번째 열 ID: Int = PK & Identity이 있습니다. 또한 테이블이 1, 2, 3, 5, 8, 12, 13 등과 같이이 열에서 순차적으로 순차적으로 진행되지 않는 경우가 많습니다. 이는 과거에 레코드가 삭제 되었기 때문입니다. 하지만 원래의 ID 번호를 이전과 동일한 순서로 다시 삽입하는 것이 불가능한 것처럼 보입니다. ...

그럼 어떻게 서버 A에서 데이터베이스 전체를 (백업/복원없이) 복사합니까? 서버 B로? 참고 : Management Studio에서 두 서버의 두 데이터베이스에 모두 연결할 수 있습니다. 또한 대상 서버는 제 것이 아니며 공유 된 호스트 DB이며 데이터베이스에만 액세스 할 수 있습니다. 대상 서버 설정을 변경할 권한이 없습니다.

나는 다음 시도했다 :

  • 는 전체 데이터베이스 옵션에 대한 스크립트를 생성
  • 수출 데이터베이스 옵션
  • 백업/데이터베이스를 복원 - 때문에 버전 잘못 일치

실패 필자는 모든 테이블에서 ID 사양을 일시적으로 '비활성화'하고 데이터를 삽입 한 다음 ID를 다시 다시 전환해야 할 수도 있습니다. 그러나 데이터베이스 구조를 조작하기위한 스크립트 작성에 나는 끔찍합니다. 데이터 자체, 할 수 있습니다. 그러나 데이터베이스 구조를 조작하면서 스크립트를 사용하여 작업 할 시간조차 없었던 도구를 사용하는 데 너무 익숙해졌습니다.이 특별한 시나리오 이외에 결코 배울 필요가 없기를 바랍니다.

+3

삽입에 대해'SET IDENTITY_INSERT MyTableName ON' 만하면되고, 쿼리의'INSERT'와'SELECT' 부분 모두에 컬럼 목록을 나열하면됩니다. – JNK

답변

1

나는 실제로 그것을 알아 냈다. 이미 ID 사양을 일시적으로 사용하지 못하게하는 방법이 있어야한다는 것을 이미 알고 있었지만 솔루션은 조금 다릅니다. 아이덴티티 사양을 '비활성화'및 '다시 활성화'하는 대신 IDENTITY_INSERT이라는 또 다른 명령을 사용합니다.이 명령을 사용하면 ID 필드에 값을 삽입 할 수 있으며 다시 스위치 백해야합니다 꺼져. IDENTITY_INSERT 스위치는 연결 세션마다 있으므로 다른 세션에는 영향을주지 않습니다. IDENTITY_INSERT이 켜져 있으면 해당 ID 필드에 대해 특정 값이있는 레코드를 삽입 할 수 있습니다 (기본 키 제약 조건 내에있는 한).

실제 해결책은 SET IDENTITY_INSERT MyTableName ON이 아닌 데이터베이스 내보내기 유틸리티 (SQL 관리 스튜디오)에서 스크립트를 작성하는 것이 아니라 테이블을 선택할 때 모든 테이블을 선택하고 IDENTITY_INSERT을 사용하는 고급 설정을 선택하십시오.