2010-03-09 2 views
10

이있는 테이블 삭제 "A"테이블의 경우 FK를 통해 "A.Id"에 약 30 개의 다른 테이블이 종속되어 있습니다.SQL Server : FK

통합 테스트의 경우 테이블을 삭제하고 정의 된 상태를 만들기 위해 테이블을 다시 만들어야합니다. 종속 객체 때문에 테이블을 삭제하고 다시 작성할 수있는 방법이없는 것처럼 보입니다. 오류 메시지는 다음과 같습니다

가 외국 KEY 제약

질문 (들)에 의해 참조 때문에 객체 dbo.A ' 을 삭제할 수 없습니다 :

  • 테이블 "A"를 삭제하고 다시 만들 수있는 방법은입니까?
  • (또는) 스키마 종속성을 전역 적으로 해제하는 방법이 있습니까?
  • (또는) 테이블 "A"를 삭제하고 복원하고 모든 종속성을 복원하기 전에 (모든!) 종속성을 백업하는 방법이 있습니까?
+0

매번 전체 상태가 처음부터 생성되는 통합 테스트에 별도의 DB를 사용하지 않는 이유는 무엇입니까? – dbemerlin

+0

데이터베이스가 크지 만 (많은 종속 개체가있는 수백 개의 테이블). 그런 식으로 진행되면 모든 통합 테스트는 시작 시간과 실제 테스트없이 약 45 초 x 걸립니다. 또한 일부 테이블에는 데이터가 들어 있습니다. (사용자 정의 데이터가없는 총 데이터베이스 덤프는 약 35MB입니다). 통합 서버를 사용하여 매번 체크인 할 때마다 실행하려는 _many_ 통합 테스트가 있습니다. – Robert

+0

각 통합 상태에서 DB의 초기 상태가 동일해야합니까? 아니면 시작 페널티를 한 번 지불하고 상태에 변경이 발생했을 때마다 모든 테스트를 취소 할 수 있습니까? – Mikeb

답변

3

SSMS에서 데이터베이스로 이동하여 마우스 오른쪽 버튼을 클릭하십시오. 작업을 선택하고 스크립트를 생성하십시오. 그런 다음 옵션을 통해 원하는 방식으로 설정하십시오 (Probaly는 테이블의 외래 키를 선택하고 종속 오브젝트를 작성하고 삭제 한 후 재 작성하지 말고 옵션을 사용하면됩니다.그런 다음 FK를 스크립팅 할 테이블을 선택하고 파일에 스크립트를 작성하십시오. 파일을 열고 drop 문을 하나의 파일로 분리하고 create 문을 다른 파일로 분리하십시오. 이제 실행할 수있는 tweo 파일이있어서 테스트를 실행할 때 자동으로 원하는대로 할 수 있습니다. 마지막 테스트가 실행 된 이후로 변경된 경우를 대비하여 첫 번째 테스트를 실행하기 전에 파일을 다시 만들 것을 제안하지만 개별 테스트는 수행하지 않는 것이 좋습니다.

+0

감사합니다. 매우 감사드립니다. 그것이 나를 위해 가장 효과가있는 것입니다! – Robert

4

Management Studio에서 테이블을 마우스 오른쪽 단추로 클릭하고 모든 외래 키를 포함하는 CREATE 및 DROP을 스크립팅 할 수 있습니다.


보다 구체적으로 말하자면, 이는 테이블이 의존하는 모든 제약 조건을 제공합니다. 그러나이 테이블에 종속 된 외래 키 목록을 제공하지는 않습니다. 따라서 SMS의 테이블을 마우스 오른쪽 버튼으로 클릭하여 생성하는 스크립트 외에도 모든 외래 키를 찾아 스크립트해야합니다. 이들의 목록을 얻으려면, 당신과 같이 쿼리를 실행할 수 있습니다 이들 각각에 대해

select FKConstraint.TABLE_NAME, FKConstraint.CONSTRAINT_NAME 
from INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 
    Join INFORMATION_SCHEMA.TABLE_CONSTRAINTS As UniqueConstraint 
     On UniqueConstraint.CONSTRAINT_NAME = INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS.UNIQUE_CONSTRAINT_NAME 
    Join INFORMATION_SCHEMA.TABLE_CONSTRAINTS As FKConstraint 
     On FKConstraint.CONSTRAINT_NAME = INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS.CONSTRAINT_NAME   
Where UniqueConstraint.TABLE_NAME = 'TableA' 

, 당신이 만들고 드롭 스크립트가 필요합니다. 드롭 스크립트의 맨 위에 드랍을 추가하고 작성 스크립트의 끝에서 스크립트를 작성합니다.

+0

이것은 참조 종속성을 포함하지 않습니다. – Robert

+1

무슨 뜻인가요? SMS는 테이블에 모든 외래 키를 삭제할 스크립트를 작성한 다음, 결국 테이블을 삭제합니다. 또한 생성은 모든 외래 키를 생성합니다. – Thomas

+0

흠, 나는 이것을 시도하고 많은 스크립트를 가지고 : "존재하는 경우 (선택 * FROM sys.check_constraints WHERE"...하지만 실행할 때, 나는 여전히 얻을 : "dbo.A 개체를 삭제할 수 없습니다. "FOREIGN KEY 제약 조건에 의해 참조 되었기 때문에"이것은 정말 이상합니다! – Robert

2

SQL Server Management Studio의 테이블을 확장하고 Constraints 폴더를 확장합니다.

다시 만들 수 있도록 제약 조건을 적어 두십시오. 제약 조건을 삭제하고 테이블을 삭제하십시오. 테이블을 다시 작성하고 제약 조건을 다시 만듭니다.

+0

나는 그것에 대해서도 생각했다. 그러나 많은 테이블에는 많은 제약과 의존성이 있기 때문에 이것은 많은 작업이 될 것이다. (그리고 나는 많은 노력이 필요하다 .--)) – Robert

+0

그래, 나는 Mircosoft가 이 작업을 더 쉽게 수행하십시오. 내가해야 할 때마다 나는 큰 소리로 불평한다. ;-) –

2

트랜잭션을 사용하십시오. 테스트가 끝나면 롤백합니다.

+0

좋은 생각이지만 SQL 연결을 확보 할 수 없어서 트랜잭션 (?)을 제어 할 수있는 방법이 없습니다. – Robert

5

sys.foreign_key_columns 시스템 테이블을 살펴보십시오. 저는 여기에 테이블 주어진 의지, 주위에 누워 있었다 예를 들어이야, 열이 다른 테이블에 맞도록 제작되어있어 그것의 어떤을 설명 :이

DECLARE @tableName VARCHAR(255) 
SET @tableName = 'YourTableName' 

SELECT OBJECT_NAME(fkc.constraint_object_id) AS 'FKName', OBJECT_NAME(fkc.[referenced_object_id]) AS 'FKTable', c2.[name] AS 'FKTableColumn', @tableName AS 'Table', c1.[name] AS 'TableColumn' 
    FROM sys.foreign_key_columns as fkc 
     JOIN sys.columns AS c1 ON c1.[object_id] = fkc.[parent_object_id] AND c1.[column_id] = fkc.[parent_column_id] 
     JOIN sys.columns AS c2 ON c2.[object_id] = fkc.[referenced_object_id] AND c2.[column_id] = fkc.[referenced_column_id] 
    WHERE fkc.[parent_object_id] = OBJECT_ID(@tableName) 
    ORDER BY OBJECT_NAME(fkc.constraint_object_id) 

, 또는 어떤 변화가-, 당신은 외국을 찾을 수 키, 드롭, 물건, 그리고 외래 키를 다시 만듭니다.

SQL2005 및 SQL2008에서 작동하는 것으로 알고 있습니다. SQL2000/MSDE에서 작동하는지 정말로 모르겠습니다.

0

데이터베이스 초기화 테스트 설정에서 가상 서버를 유지 관리하는 것이 좋습니다. VM을 부팅하고 테스트를 수행 한 다음 변경된 VM을 버립니다.

+0

데이터베이스를 복원하는 것이 VM을 복원하는 것보다 빠를 것이라고 생각합니다. – Robert

+0

아니요, 전혀 복원 할 수 없습니다. 원할 때 VM을 부팅하는 데 1 ~ 2 분이 걸릴 것입니다. –