2008-10-22 4 views
73

빌드 프로세스의 일부로 4 가지 환경에 코드를 배포 할 때 데이터베이스 업데이트 스크립트를 실행합니다. 또한, 동일한 쿼리가 제품에 출시되기 전에는 이되어 주어진 데이터베이스에서 여러 번 실행할 수 있습니다. 이와 같이 :데이터베이스 스키마가 있는지 쿼리하는 방법

IF NOT EXISTS (SELECT * FROM sys.tables WHERE object_id = OBJECT_ID(N'[Table]')) 
BEGIN 
    CREATE TABLE [Table] 
    (...) 
END 

현재 배포/빌드 스크립트에 스키마 작성 명령문이 있습니다. 스키마의 존재 여부는 어디서 쿼리합니까?

+2

허용 대답을 변경하는 것을 고려하십시오. 당신이 받아 들인 대답이 실제로 당신을 위해 쓰여진대로 작용할 가능성은 없습니다. –

답변

108

sys.schemas을 찾고 계십니까? CREATE SCHEMA이 (the answer below 당) 자신의 배치에서 실행해야한다는

IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'jim') 
BEGIN 
EXEC('CREATE SCHEMA jim') 
END 

+0

Darn ... 게시물을 더 읽기 쉽도록 편집하는 데 걸리는 시간에 ... 내 문제를 해결했습니다. 고마워요! – Pulsehead

+17

CREATE SCHEMA가 배치의 첫 번째 문이어야하기 때문에 SQL 2008에서 작동하지 않습니다. 해결 방법은 vfilby 게시물을 참조하십시오. – sergiom

+3

성능을 향상 시키려면 'sys.schemas에서 1 개 선택'을 사용할 수 있습니다. – vijaysylvester

137

@bdukes 스키마가 존재하는 경우를 결정하는 돈에 맞다, 그러나 문은 위의 SQL에서 작동하지 않습니다 서버 2005. CREATE SCHEMA <name>은 자체 배치로 실행해야합니다. 해결 방법은 exec에서 CREATE SCHEMA 문을 실행하는 것입니다. 여기

는 내 빌드 스크립트에 사용 된 것입니다 :

IF NOT EXISTS (SELECT 1 FROM sys.schemas WHERE name = '<name>') 
BEGIN 
    -- The schema must be run in its own batch! 
    EXEC('CREATE SCHEMA <name>'); 
END 
+0

은 매력처럼 작동합니다. 이것은 심지어 내 인쇄 진술과 모든 것을 넣을 수있게 해줍니다. – Tony

+0

정답이어야합니다. – Pimenta

1

그냥 할 수 추가, 다음 버전>의 가능성 (그러나 가능성)을 설명하는 형식 변환 오류가 발생 "방어" 1 일치하는 Schema의 경우 유효성 검사 코드가 종종 의도적으로 예외를 throw하는 것과 유사합니다. 예외적으로 예외를 throw하는 것이 좋으며 모든 가능한 반환 결과를 설명하는 것이 "최상의 방법"이라고 생각합니다.하지만 치명적인 예외를 생성하는 경우 일지라도 처리 중지의 알려진 영향은 일반적으로 트래핑되지 않은 오류의 알려지지 않은 계단식 효과보다 낫습니다. 가능성이 희박하기 때문에 별도의 Count 검사 + Throw 또는 Try-Catch-의 문제가 발생하지 않아도 사용자 친화적 인 치명적 오류가 발생하지만 여전히 치명적인 오류는 발생하지 않을 것으로 생각했습니다.

SS 2005- :

declare @HasSchemaX bit 
set @HasSchemaX = case (select count(1) from sys.schemas where lower(name) = lower('SchemaX')) when 1 then 1 when 0 then 0 else 'ERROR' end 

SS 2008+ :

declare @HasSchemaX bit = case (select count(1) from sys.schemas where lower(name) = lower('SchemaX')) when 1 then 1 when 0 then 0 else 'ERROR' end 

다음은 :

if @HasSchemaX = 1 
begin 
    ... 
end -- if @HasSchemaX = 1 
+0

나는 당신이 경우 구분 데이터 정렬을 사용하면 하나 이상의 일치하는 스키마를 가지고하는 것이 가능하다 생각하지만 "오류 처리"는 다음과 같은 오류가 발생합니다. * int 데이터 형식에 VARCHAR 값 'ERROR'을 변환 할 때 변환이 실패 * – Stijn

+0

@Stijn : "디자인"은 유효성 검사 코드가 의도적으로 의도적으로 "예외"를 throw하는 것과 유사합니다. 당신이 말했듯이,이 일어날 " '가능성'"아니, 그래서 이럴, 더 사용자 친화적 치명적인 오류를 발생 확인 Count' '전체'Try'-'Catch' 가치 또는 별도의 아니었지만, 상관없이, 치명적인 오류가 나는 것이 좋습니다. 나는 믿고 나는 그러나 가능성, 심지어는 처리를 중지의 알려진 효과가 해제 갇혀의 알 수없는 연쇄 효과에 비해 일반적으로 더 나은 때문에 단지 치명적인 예외를 생성 할 수 있다면 모든 가능한 반환 결과를 설명하기 위해 " '모범 사례'"믿습니다 오류. – Tom

+0

모두 괜찮아요. 의도적인지 확신 할 수 없었습니다. 당신의 대답은 방금 당신의 코멘트에서 준 것처럼 몇 가지 추가 설명의 이점을 얻을 수 있습니다. – Stijn

관련 문제