2014-07-22 3 views
1

Access 데이터베이스를 SQL Server 2008로 마이그레이션하는 프로젝트를 진행하고 있습니다. 모든 개체를 SQL Server 개체로 성공적으로 다시 만들었지 만 원래 데이터베이스가 여전히 사용 중이므로, 일부 데이터가 변경되었습니다.SQL Server 테이블 구조를 수정하지 않고 데이터를로드합니다.

테이블 구조와 관계를 파괴하지 않고 영향을받는 테이블을 다시로드하는 가장 쉬운 방법은 무엇입니까? 설치에 포함 된 가져 오기 및 내보내기 데이터 도구를 사용해 보았지만 서버의 데이터를 지우도록 요청할 때마다 외래 키에 대해 불평합니다.

답변

2

아래 스크립트를 사용하면 각 외래 키 제약 조건에 대해 '작성'및 '삭제'문을 생성 할 수 있습니다.

라이브 환경에서이 점을 확인 했으므로 정상적으로 작동합니다. 시간을 좀 주면 솔루션에 대해 확신 할 수 있습니다.

  1. 복사

  2. 는 변경없이 실행 아래의 스크립트, 당신은 FOREIGN KEY를 점유 각 테이블에 대한 문을 ALTER 얻을 것이다. 그 문

  3. 복사 및 반복은 이제 2

    3 단계

    --SET @action='DROP' 
    

    SET @action='DROP' 
    
  4. 지금 줄을 변경 다른 쿼리에 저장 삭제하고 모두 작성하는 스크립트가 있어야합니다. EIGN KEYS.

  5. , 데이터를 닦아 후 4 단계

  6. 후 얻은 DROP 문을 실행 다시 외래 키를 만들 ALTER 문을 실행합니다.

  7. 데이터를 가져옵니다.

스크립트

DECLARE @schema_name SYSNAME; 
DECLARE @table_name SYSNAME; 
DECLARE @constraint_name SYSNAME; 
DECLARE @constraint_object_id INT; 
DECLARE @referenced_object_name SYSNAME; 
DECLARE @is_disabled BIT; 
DECLARE @is_not_for_replication BIT; 
DECLARE @is_not_trusted BIT; 
DECLARE @delete_referential_action TINYINT; 
DECLARE @update_referential_action TINYINT; 
DECLARE @tsql NVARCHAR(4000); 
DECLARE @tsql2 NVARCHAR(4000); 
DECLARE @fkCol SYSNAME; 
DECLARE @pkCol SYSNAME; 
DECLARE @col1 BIT; 
DECLARE @action CHAR(6); 
DECLARE @referenced_schema_name SYSNAME; 

--SET @action='DROP' 

DECLARE FKcursor CURSOR FOR 
    SELECT Object_schema_name(parent_object_id), 
    Object_name(parent_object_id), 
    name, 
    Object_name(referenced_object_id), 
    object_id, 
    is_disabled, 
    is_not_for_replication, 
    is_not_trusted, 
    delete_referential_action, 
    update_referential_action, 
    Object_schema_name(referenced_object_id) 
    FROM sys.foreign_keys 
    ORDER BY 1, 
      2; 

OPEN FKcursor; 

FETCH NEXT FROM FKcursor INTO @schema_name, @table_name, @constraint_name, @referenced_object_name, @constraint_object_id, @is_disabled, @is_not_for_replication, @is_not_trusted, @delete_referential_action, @update_referential_action, @referenced_schema_name; 

WHILE @@FETCH_STATUS = 0 
    BEGIN 
     IF @action <> 'CREATE' 
     SET @tsql = 'ALTER TABLE ' + Quotename(@schema_name) + '.' 
       + Quotename(@table_name) 
       + ' DROP CONSTRAINT ' 
       + Quotename(@constraint_name) + ';'; 
     ELSE 
     BEGIN 
      SET @tsql = 'ALTER TABLE ' + Quotename(@schema_name) + '.' 
        + Quotename(@table_name) + CASE @is_not_trusted WHEN 0 THEN ' WITH CHECK ' ELSE ' WITH NOCHECK ' END 
        + ' ADD CONSTRAINT ' 
        + Quotename(@constraint_name) 
        + ' FOREIGN KEY ('; 
      SET @tsql2 = ''; 

      DECLARE ColumnCursor CURSOR FOR 
       SELECT Col_name(fk.parent_object_id, fkc.parent_column_id), 
        Col_name(fk.referenced_object_id, fkc.referenced_column_id) 
       FROM sys.foreign_keys fk 
       INNER JOIN sys.foreign_key_columns fkc 
         ON fk.object_id = fkc.constraint_object_id 
       WHERE fkc.constraint_object_id = @constraint_object_id 
       ORDER BY fkc.constraint_column_id; 

      OPEN ColumnCursor; 

      SET @col1 = 1; 

     FETCH NEXT FROM ColumnCursor INTO @fkCol, @pkCol; 

     WHILE @@FETCH_STATUS = 0 
      BEGIN 
       IF (@col1 = 1) 
       SET @col1 = 0; 
       ELSE 
       BEGIN 
        SET @tsql = @tsql + ','; 
        SET @tsql2 = @tsql2 + ','; 
       END; 

       SET @tsql = @tsql + Quotename(@fkCol); 
       SET @tsql2 = @tsql2 + Quotename(@pkCol); 

       FETCH NEXT FROM ColumnCursor INTO @fkCol, @pkCol; 
      END; 

     CLOSE ColumnCursor; 

     DEALLOCATE ColumnCursor; 

     SET @tsql = @tsql + ') REFERENCES ' 
        + Quotename(@referenced_schema_name) + '.' 
        + Quotename(@referenced_object_name) + ' (' 
        + @tsql2 + ')'; 
     SET @tsql = @tsql + ' ON UPDATE ' + CASE @update_referential_action WHEN 0 THEN 'NO ACTION ' WHEN 1 THEN 'CASCADE ' WHEN 2 THEN 'SET NULL ' ELSE 'SET DEFAULT ' END + ' ON DELETE ' + CASE @delete_referential_action WHEN 0 THEN 'NO ACTION ' WHEN 1 THEN 'CASCADE ' WHEN 2 THEN 'SET NULL ' ELSE 'SET DEFAULT ' END + CASE @is_not_for_replication WHEN 1 THEN ' NOT FOR REPLICATION ' ELSE '' END 
        + ';'; 
    END; 

    PRINT @tsql; 

    IF @action = 'CREATE' 
    BEGIN 
     SET @tsql = 'ALTER TABLE ' + Quotename(@schema_name) + '.' 
        + Quotename(@table_name) + CASE @is_disabled WHEN 0 THEN ' CHECK ' ELSE ' NOCHECK ' END + 'CONSTRAINT ' 
        + Quotename(@constraint_name) + ';'; 

     PRINT @tsql;    
    END; 

    FETCH NEXT FROM FKcursor INTO @schema_name, @table_name, @constraint_name, @referenced_object_name, @constraint_object_id, @is_disabled, @is_not_for_replication, @is_not_trusted, @delete_referential_action, @update_referential_action, @referenced_schema_name; 
    END; 

CLOSE FKcursor; 

DEALLOCATE FKcursor; 

내가 SSIS를 확인합니다 http://sqlblog.com/blogs/john_paul_cook/archive/2009/09/20/using-powershell-to-script-foreign-key-creation-statements.aspx

+0

방금 ​​시도했지만 오류가 발생했습니다 : "테이블을 잘라낼 수 없습니다 '...'외래 키 contstraint에서 참조하기 때문에 ' – kacpr

+0

게시물을 변경했습니다. 그것과 당신은 데이터를 성공적으로 쓸어 버릴 수 있습니다. – Anoop

+1

이 위대한 일했습니다. 가져 오기 및 내보내기 마법사를 사용하여 새 데이터를로드 할 수있었습니다. 이제 그냥 테이블 구조 엉망이되지 않습니다 바란다. – kacpr

1

데이터를 데이터베이스로 변환하기 위해 SSIS (SQL Server Integration Service)를 사용하는 것이 좋습니다.

새 데이터베이스에 액세스 데이터베이스를 가져오고 Redgate Data Compare 도구 또는 다른 도구를 사용하여 두 데이터베이스 간의 데이터를 비교하고 동기화 데이터 스크립트를 가져올 수도 있습니다.

+0

에서 참조, 나는 그것에 대해 들어 본 적이 있지만 서비스가 누락되어 있기 때문에 내가 전에 그것을 밖으로 시도 할 수 없습니다 내 설치. – kacpr

+0

두 번째 요점은 이미 해결되었습니다 :) – christiandev

2
  1. 당신은 (SQL 서버)에 다른 스키마와 같은 새 테이블을 만들 수 있습니다, 어쩌면 을 준비. 수출/가져 오기 도구
  2. 를 사용하여 준비 테이블
  3. 복사 액세스 데이터는 소스 테이블
  4. 동기화 도구를 사용하여 데이터를 준비 테이블을 비교하는 Red-Gate data compare의 흔적 버전을 사용하십시오.

이렇게하면 테스트를위한 준비 영역을 가질 수 있습니다.

관련 문제