아래 스크립트를 사용하면 각 외래 키 제약 조건에 대해 '작성'및 '삭제'문을 생성 할 수 있습니다.
라이브 환경에서이 점을 확인 했으므로 정상적으로 작동합니다. 시간을 좀 주면 솔루션에 대해 확신 할 수 있습니다.
복사
는 변경없이 실행 아래의 스크립트, 당신은 FOREIGN KEY를 점유 각 테이블에 대한 문을 ALTER 얻을 것이다. 그 문
복사 및 반복은 이제 2
3 단계
--SET @action='DROP'
SET @action='DROP'
- 에
지금 줄을 변경 다른 쿼리에 저장 삭제하고 모두 작성하는 스크립트가 있어야합니다. EIGN KEYS.
, 데이터를 닦아 후 4 단계
후 얻은 DROP 문을 실행 다시 외래 키를 만들 ALTER 문을 실행합니다.
데이터를 가져옵니다.
스크립트
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
방금 시도했지만 오류가 발생했습니다 : "테이블을 잘라낼 수 없습니다 '...'외래 키 contstraint에서 참조하기 때문에 ' – kacpr
게시물을 변경했습니다. 그것과 당신은 데이터를 성공적으로 쓸어 버릴 수 있습니다. – Anoop
이 위대한 일했습니다. 가져 오기 및 내보내기 마법사를 사용하여 새 데이터를로드 할 수있었습니다. 이제 그냥 테이블 구조 엉망이되지 않습니다 바란다. – kacpr