문제

빌드 프로세스의 일환으로 4 개의 다른 환경에 코드를 배포 할 때 데이터베이스 업데이트 스크립트를 실행합니다. 또한, 동일한 쿼리가 프로덕션에 릴리스를 삭제할 때까지 추가되므로 가지다 주어진 데이터베이스에서 여러 번 실행할 수 있습니다. 이와 같이:

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

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

도움이 되었습니까?

해결책

를 찾습니까 Sys.Schemas?

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

주목하십시오 CREATE SCHEMA 자체 배치로 실행해야합니다 (당 아래 답변)

다른 팁

@bdukes는 스키마가 존재하는지 결정하기위한 돈에 맞지만 위의 진술은 SQL Server 2005에서 작동하지 않습니다. CREATE SCHEMA <name> 자체 배치로 실행해야합니다. 주변의 작업은 CREATE SCHEMA exec의 진술.

내 빌드 스크립트에서 사용한 내용은 다음과 같습니다.

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

그냥 추가의 "방어", 다음 버전은> 1 일치하는 가능성을 설명하기 위해 유형 변환 오류를 생성합니다. Schema'검증 코드가 종종 의도적으로 예외를 던지는 방식과 유사하며, 나는 그것이 좋다고 생각하기 때문에 가능한 모든 수익 결과를 설명하는 것이 "'모범 사례 '"라고 생각합니다. 처리 중지는 일반적으로 트랩되지 않은 오류의 알려지지 않은 계단식 효과보다 낫습니다. 가능성이 거의 없기 때문에 별도의 문제의 가치가 있다고 생각하지 않았습니다. Count 점검 + Throw 또는 Try-Catch-Throw 더 사용자 친화적 인 치명적인 오류를 생성하지만 여전히 치명적인 오류를 생성합니다.

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

이것은 오래되었으므로 추가해야한다고 느낍니다. EXECUTE('CREATE SCHEMA <name>') 실제로 부정적인 결과에이를 생성합니다.

DECLARE @schemaName sysname = 'myfunschema';
-- shortest
If EXISTS (SELECT 1 WHERE SCHEMA_ID(@schemaName) IS NOT NULL)
PRINT 'YEA'
ELSE
PRINT 'NOPE'

SELECT DB_NAME() AS dbname WHERE SCHEMA_ID(@schemaName) IS NOT NULL -- nothing returned if not there

IF NOT EXISTS ( SELECT  top 1 *
                FROM    sys.schemas
                WHERE   name = @schemaName )
PRINT 'WOOPS MISSING'
ELSE
PRINT 'Has Schema'

SELECT SCHEMA_NAME(SCHEMA_ID(@schemaName)) AS SchemaName1 -- null if not there otherwise schema name returned

SELECT SCHEMA_ID(@schemaName) AS SchemaID1-- null if not there otherwise schema id returned


IF EXISTS (
    SELECT sd.SchemaExists 
    FROM (
        SELECT 
            CASE 
                WHEN SCHEMA_ID(@schemaName) IS NULL THEN 0
                WHEN SCHEMA_ID(@schemaName) IS NOT NULL THEN 1
                ELSE 0 
            END AS SchemaExists
    ) AS sd
    WHERE sd.SchemaExists = 1
)
BEGIN
    SELECT 'Got it';
END
ELSE
BEGIN
    SELECT 'Schema Missing';
END
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top