Pergunta

Como parte do nosso processo de construção, executamos um script de atualização de banco de dados, à medida que implantamos o código em 4 ambientes diferentes. Além disso, uma vez que a mesma consulta será adicionada até lançarmos um lançamento na produção tem Para poder executar várias vezes em um determinado banco de dados. Assim:

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

Atualmente, tenho uma declaração de esquema CREATE no script de implantação/construção. Onde faço a consulta para a existência de um esquema?

Foi útil?

Solução

Você está procurando Sys.schemas?

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

Observe que o CREATE SCHEMA deve ser executado em seu próprio lote (por a resposta abaixo)

Outras dicas

O @Bdukes está certo para determinar se o esquema existe, mas a declaração acima não funcionará no SQL Server 2005. CREATE SCHEMA <name> precisa correr em seu próprio lote. Uma trabalho por aí é executar o CREATE SCHEMA declaração em um exec.

Aqui está o que eu usei em meus scripts de construção:

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

Apenas para ser extra "Defensivo", a versão a seguir gera um erro de conversão de tipo para explicar a possibilidade (por mais improvável que SchemaÉ semelhante ao modo como o código de validação geralmente joga com exceções, porque acredito que é bom e acredito que é "'prática recomendada'" explicar todos os resultados possíveis de retorno, por mais improvável que seja e mesmo que seja apenas para gerar uma exceção fatal, porque os efeitos conhecidos de interromper o processamento é geralmente melhor do que os efeitos desconhecidos em cascata de erros não presos. Porque é altamente improvável, eu não achei que valeu o trabalho de um separado Count Verifique + Throw ou Try-Catch-Throw Para gerar um erro fatal mais fácil de usar, mas ainda assim um erro fatal.

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

Então:

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

Isso é antigo, por isso me sinto compelido a adicionar: para o SQL Server 2008+, tudo isso funciona (para a parte de seleção) e depois use EXECUTE('CREATE SCHEMA <name>') para realmente criá -lo em resultados negativos.

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top