2014-05-25 3 views
1

이 질문을 올바르게 설명 할 수 있기를 바랍니다.제약 조건과의 관계로 데이터베이스 테이블 배치

내 ASP.NET 프로젝트에는 미래의 업그레이드 등을 위해 MS SQL Server 데이터베이스 테이블 스크립트 목록이 들어 있습니다. 새 파일을 추가하지 않고도 스크립트를 다시 실행할 수 있습니다. 현재 내가 각 데이터베이스 테이블이 있습니다

---CREATING TABLE--- 
    IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DATABASETABLENAME]') AND type IN (N'U')) 
    //CREATE TABLE CODE HERE 

---BUILDING RELATIONSHIPS--- 
    IF NOT EXISTS (SELECT [name] FROM sysobjects WHERE [name] = 'FK_CONSTRAINTNAME') ALTER TABLE [dbo].[DATBASETABLENAME] DROP CONSTRAINT [FK_CONSTRAINTNAME] 
    //ADD CONSTRAINT CODE HERE 

내 문제는 제약 조건으로 이루어지고 테이블이 스크립트는 아직 실행했다되지 않은 경우, 테이블이 존재하지 않는되고 실패합니다.

다른 제약 조건 테이블이 존재 하는지를 확인할 수는 있지만 여전히 모든 스크립트를 두 번 실행하여 실행해야합니다.

하드 코드가 없으면 의존성에 따라 실행되는 테이블 스크립트를 식별하고 순서를 정할 수 있습니까? 미래에는 수백 개의 테이블이있을 수 있습니다.

이 정보가 충분하지 않은 경우 알려 주시기 바랍니다.

미리 감사드립니다.

+0

ASP.NET을 사용하고 있으므로 Visual Studio에서 데이터베이스 프로젝트를 사용해 볼 수 있습니다. Visual Studio에서는 이러한 문제를 처리하고 데이터베이스의 빌드 스크립트를 자동으로 생성합니다. – IsKernel

답변

1

제약 조건에 따라 테이블을 정렬하는 작은 알고리즘을 작성할 수는 있지만 항상 가능하지는 않습니다 (순환 참조가 있다고 가정). 모든 테이블을 작성한 다음 제한 조건을 추가하는 것이 가장 좋습니다 (모든 테이블이 작성된 후).

+0

감사합니다. 나는 다른 사람들이 말하는 것을보기 위해 조금 기다릴 것입니다. 테이블 스크립트에서 제약 조건을 분리하지 않기를 바랬습니다. 그러나 나는 순환 참조 문제를 이해하고 있습니다. 현재는 없지만 곧 참조 할 것입니다. – Sarah

+0

순환 참조가 없다면 배열을 정렬하는 것과 같습니다. "t1

+0

절대 그렇게 생각하지 않았습니다! – Sarah

0

나는 바보 증명 방법입니다. 내 데이터베이스에 'ScriptVersion'테이블을 추가하고 적용된 업데이트 스크립트 '버전'을 추적합니다. 내 업데이트 스크립트에서 나는 데이터베이스가 존재하는지와 '버전'에 있는지를 확인한다. 버전 번호가 맞지 않으면 오류 메시지를 인쇄합니다.

if db_id('[DATABASENAME]') is null 

이 인쇄 시작 : 여기 내 업데이트 스크립트 중 하나의 exerpt입니다 ('데이터베이스가 존재하지 않습니다. 만들기 스크립트를 실행하십시오')는 다른 끝 시작 사용 [데이터베이스 이름]

if object_id('ScriptVersion', 'U') is null 
begin 
    print('Database does not contain a Script version table. Please check the upgrade script.') 
end 
else 
begin 
    -- check the latest upgrade 
    if ((select max(ToVersion) from ScriptVersion) <> 4) 
    begin 
     print('Invalid upgrade. Check which upgrade to run.'); 
    end 
    else 
    begin 
     -- START update statements 

     exec('alter table Activities add Comments varchar(256)') 
     exec('alter table Activities add IsCancelled bit not null default(0)') 

     -- END update statements 


     -- Insert new script version (update from version #4 to version #5) 
     exec('insert into ScriptVersion(Description, FromVersion, ToVersion) values (''Upgrade 5.'', 4, 5)') 
    end 
end 

내가 'DependencyName'또는 DependencyId 및 IsDependency를 추가 할 수 있습니다 특정 상황에서

이동 필드를 버전 테이블에 추가하거나 (특히 종속성에 대한 테이블을 작성) 주어진 종속성이 예 또는 아니오 인 쿼리와 함께 존재하는지 확인하십시오.

+0

고마워요. 그것은 비록이 경우에도 정말 도움이되지 않습니다. 감사합니다 :) – Sarah

+0

가까운 장래에 사용하겠습니다. 고마워요 @SeanTech – Horaciux

관련 문제