DTS 가져 오기 / 내보내기 마법사를 사용하여 데이터를 가져올 때 FK 제약 조건을 어떻게 처리합니까?


16

SQL Server 가져 오기 및 내보내기 마법사를 사용하여 프로덕션 DB에서 내 dev db로 데이터를 복사하려고하는데 "INSERT 문이 FOREIGN KEY 제약 조건과 충돌했습니다"라는 오류로 실패하면 많은 테이블이 40 개가 넘습니다. FK 제약 조건의 경우 드롭 제약 조건을 작성하거나 제약 조건 스크립트를 추가하지 않고도이를 처리하는 쉬운 방법이 있습니까?

편집 : 방금 내가 실행중인 SQL Server의 Web Edition에서 DTS가 패키지를 저장할 수 없다는 것을 알았습니다.

답변:


28

SQLTeam.com에서이 솔루션을 받았습니다.

사용하다:

 EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'

그런 다음 데이터를 가져옵니다

EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'

이 방법을 사용하면 문제없이 모든 데이터를 가져올 수있었습니다.


1
sp_msforeachtable(및 sp_MSForEachDb)은 문서화되지 않았으며 지원되지 않습니다. 사용을 피하거나 피해야합니다. 테이블을 건너 뛸 수 있습니다! > - @AaronBertrand에서이 포스트를 참조하십시오 sqlblog.com/blogs/aaron_bertrand/archive/2010/12/29/... 이 연결 항목 - (MS 그들이 그것을 해결 습관을 나타내는을) -> connect.microsoft.com/SQLServer / feedback / details / 264677 /…
Kin Shah

데이터 내보내기에 대한 FK 제약 조건을 극복하려고 두뇌를 두들겨 몇 시간 동안 완벽하게 일했습니다.
levininja

Azure SQL V12에서 실행하면 "저장 프로 시저 'sp_msforeachtable'을 (를) 찾을 수 없습니다."오류가 발생합니다.
Dai

어쨌든 작동하지 않습니다 : /
Douglas Gaskell

당신은 생명의 은인의 사람이야
캔 사힌 Bakır

5

내가 제어하지 않은 서버에서 내 컴퓨터에 데이터베이스의 정확한 사본을 생성했습니다.

나는 schmuck 이지만 이것이 내가 한 일입니다.

  1. 소스 제어에 있던 내 스크립트에서 DB를 생성했습니다 (힌트, 힌트!) 스크립트가없는 경우 Tasks옵션을 통해 기존 DB에서 언제든지 생성 할 수 있습니다 .

  2. 작성시 데이터가 YourDB 에 자동 삽입 된 경우을 실행하십시오 DELETE FROM YourDB.dbo.tblYourTable.

    • 외래 키가 존재하면 데이터를자를 수 없으므로을 사용해야 DELETE합니다.
  3. 대상 서버에서 이것을 실행하십시오. USE YourDB; EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all';

  4. 에서 YourDB 를 마우스 오른쪽 버튼으로 클릭하십시오 Object Explorer. 클릭 Tasks->Import Data...

  5. 마법사의 처음 몇 화면은 자명하다.

  6. Select Source Table and Views마법사의 화면에서 복사 할 모든 테이블 옆에있는 확인란을 클릭합니다.

  7. 해당 화면의 각 행 (표)에 대해 강조 표시 한 다음을 클릭하십시오 Edit Mappings.

  8. 각 행 (표)마다 Append rows to the destination table및을 클릭 / 확인 Enable identity insert합니다.

    • 명령을 실행 Delete rows in destination table하지 않아 클릭 하면 실패합니다 . 이전의 제어를받지 않기 때문에 외래 키와 여전히 충돌 DELETE하는 TRUNCATE명령을 실행 합니다.TRUNCATENOCHECK CONSTRAINT
  9. 나머지 마법사를 클릭하고을 클릭하십시오 Finish.

  10. 오류를 감시하십시오 ; 경고는 무시해도됩니다.

    • 오류가 있으면 Report단추를 클릭 하고 보고서를보십시오. 시도하고 있었는지 조사해내는 Success, Error하고 Stopped. 해당 보고서에 묻혀있는 오류의 근본 원인은 무엇이든 수정해야합니다. 그런 다음 아마해야 할 것입니다 DELETE FROM YourDB.dbo.theErrorTable. 이제 가져 오기 마법사에서 뒤로 단추를 클릭하고 모든 테이블을 선택 취소하십시오 Success. 광고 인피니 엄을 반복하십시오.
  11. 대상 서버에서 이것을 실행하십시오. USE YourDB; EXEC sp_msforeachtable 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all';

    • 오류가 있으면 ... 모르겠지만 수정 한 후 다시 시도하십시오!
  12. 예이! :)

이 질문에 답하는 모든 사람과 SE 네트워크에서 이와 비슷한 질문에 답해 주셔서 감사합니다.


당신은 생명의 은인
Tom Gullen

1
진심으로 감사합니다, 손상된 드라이브에 백업이 있었고, DB를 어디서나 복사 할 수 없었습니다 (오류 / 오류). 이 방법으로 한 번에 몇 개의 테이블을 가져 오면 99 %의 데이터를 복구하는 데 도움이되었습니다.
Tom Gullen

1
당신은 바위! 나를 도와주는 또 다른 명령 : EXEC sp_msforeachtable 'delete from? '; 오류가 발생하면 모든 것이 삭제됩니다. sp_msforeachtable 스크립트는 여기 gist.githubusercontent.com/metaskills/893599/raw/...
Sanchitos

4

가져 오기 마법사에서 먼저 행을 삭제하고 ID 필드가있는 경우 아래와 같이 ID 삽입을 사용할 수 있습니다.

여기에 이미지 설명을 입력하십시오

검사 제한 조건을 사용하지 않으려면 마법사가 패키지 저장을 요청하면 저장 한 후 다음과 같이 연결 관리자를 편집하십시오.

여기에 이미지 설명을 입력하십시오

참고 : 외래 키가 정의되어 있으면 테이블을 잘라낼 수 없습니다.


3

제약 조건을 삭제하지 마십시오.

마법사가 생성 한 SSIS 패키지를 저장 한 다음 BIDS / SSDT에서 편집하면됩니다. 패키지를 편집하면 테이블이 처리되는 순서를 제어하여 부모 테이블을 처리 한 다음 모든 부모 테이블이 완료되면 자식 테이블을 처리 할 수 ​​있습니다.


3
그것은 실제로 효율적이지 않습니다. 모든 것이 올바른 순서로되어 있는지 확인하기 위해 패키지를 수정하는 데 거의 1 시간이 걸리며 심지어는 확실하지 않습니다. DB가 커짐에 따라 더 많은 번거 로움이 생길 것입니다. 감사합니다. 이를 수행하는 간단한 방법이 있어야합니다.

1

이와 같은 문제는 SQL 서버를 만든 사람들이 실제로 제품을 사용한 적이 없다는 것을 보여줍니다. 이것은 그들이 단순히 무엇을 올바르게 잊었는지 궁금해해야 할 눈부신 누락입니다 (다른 DB 가하는 것처럼이 작업을 수행하기 위해 극복해야했던 약 30 가지의 다른 미친 문제 목록이 있습니다. 처음부터이 작업을 수행하기 위해 화려한 마법사가 필요하다는 사실을 포함하여 [이 마법사가 동일한 DB에 대해 동일한 테이블을 연결하고 열거 할 때까지 기다린 시간이있을 때마다 ... 나는 좋은 휴가를 보낼 시간이있다]).

나는 매우 게으르고 입력하고 싶지 않습니다 EXEC sp_msforeachtable ...내가 할 때마다 두 번. 내 해결 방법은 프로덕션 서버에 제약 조건을두고 dev 서버에서 제약 조건을 제거하는 것이 었습니다. 이렇게하면 오류가 방지되지만이 방법에는 몇 가지 매우 큰 부작용이 있습니다. 첫째, 더 이상 전체 백업을 복원하지 않아도 개발자 서버에 전체 백업을 복원 할 수 없습니다. 둘째, 데이터 소비자가 이러한 제약 조건을 적용하거나 신경 쓰지 않는다고 확신 할 때 가장 효과적입니다. 필자의 경우 하나의 소비자 (웹 사이트) 만 있으므로 이러한 제한 사항을 사이트 코드에도 작성했습니다 (즉, 사용자 레코드를 삭제하기 전에 해당 사용자의 모든 전화 레코드를 먼저 삭제합니다). 예, 이것은 본질적으로 제약 조건의 필요성을 처음부터 무시하고 내가해야 할 작업을 두 배로 늘리지 만 DBMS 기반 제약 조건이 있거나없는 코드가 작동하는지 확인할 수있는 기회를 제공합니다 (사실은 여전히 ​​제품에 있습니다 비상 계획으로 만 서버). 당신은 이것을 내 디자인의 결함이라고 부를 수는 있지만 결함이있는 DBMS에 대한 해결 방법이라고 부릅니다. 어쨌든 MSSQL 자체의 디자인에 대처할 수 없기 때문에 MSSQL 이외의 다른 곳에서도이 작업을 더 빠르고 쉽게 수행 할 수 있습니다.


0

프로덕션 서버에서 중요한 데이터이므로 백업 및 복원을 수행 할 수 없습니다. 적절한 권리가 없다면 실제로 더욱 복잡해집니다. 그러나 db backup n restore가 있으면 수행 할 수 있습니다.

또는 다른 방법으로 권장하는 한 가지 방법은 모든 제약 조건과 색인을 삭제하고 데이터를 가져 오거나 내 보내면 다시 추가하는 것입니다.

정확한 답변은 아니지만 빠르게 처리됩니다.


고맙지 만, 특히 드롭 / 생성 제약 조건 스크립트를 작성하고 싶지 않다고 말했습니다.

0

그 주제를 읽으십시오. 그것은 오래된 게시물이지만 다음은 미래 사람들이 이것을 읽는 데 도움이되는 것입니다.

필자의 경우 빈 동일한 테이블로 가져오고 싶었습니다. 매핑을 편집 할 때 <ignore>기본 키를 선택 합니다. 내 모든 내용이 자동으로 멋지게 추가됩니다.

누군가에게 도움이되기를 바랍니다.


1
외래 키에 도움이되는 기본 키를 무시 하시겠습니까?
dezso

제 경우에는 실제로 테이블을 복제했기 때문에 그렇습니다. 그래서 나는 같은 기본 키로 끝났습니다. 따라서 내 테이블을 가리키는 외래 키는 여전히 올바른 항목에 해당합니다.
Greg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.