Como parte do nosso processo de construção, executamos um script de atualização do banco de dados à medida que implantamos o código em 4 ambientes diferentes. Além disso, como a mesma consulta será adicionada até colocarmos uma versão em produção, ela deve ser capaz de ser executada várias vezes em um determinado banco de dados. Como isso:
IF NOT EXISTS (SELECT * FROM sys.tables WHERE object_id = OBJECT_ID(N'[Table]'))
BEGIN
CREATE TABLE [Table]
(...)
END
Atualmente, tenho uma instrução de esquema de criação no script de implantação / construção. Onde posso consultar a existência de um esquema?
sql-server-2005
schema
Pulsehead
fonte
fonte
Respostas:
Você está procurando por sys.schemas ?
Observe que o
CREATE SCHEMA
deve ser executado em seu próprio lote (de acordo com a resposta abaixo )fonte
SELECT 1/0...
@bdukes acertou em cheio para determinar se o esquema existe, mas a instrução acima não funcionará no SQL Server 2005.
CREATE SCHEMA <name>
precisa ser executado em seu próprio lote. Uma solução alternativa é executar aCREATE SCHEMA
instrução em um exec.Aqui está o que eu usei em meus scripts de construção:
fonte
Isso é antigo, então me sinto compelido a adicionar: Para SQL SERVER 2008+ Tudo isso funciona (para a parte selecionada) e, em seguida, use
EXECUTE('CREATE SCHEMA <name>')
para realmente criá-lo em resultados negativos.fonte
IF schema_id ('MySchemaName') IS NULL
funciona bem e parece um pouco mais conveniente do que a resposta aceita.Apenas para ser extra "defensivo", a versão a seguir gera um erro de conversão de tipo para levar em conta a possibilidade (embora improvável) de> 1 correspondência
Schema
semelhante a como o código de validação muitas vezes intencionalmente lança exceções porque acredito que é bom e acredito que é "'prática recomendada'" para considerar todos os resultados de retorno possíveis, por mais improváveis que sejam, e mesmo que seja apenas para gerar uma exceção fatal, porque os efeitos conhecidos de interromper o processamento geralmente são melhores do que os efeitos em cascata desconhecidos de erros não interceptados. Por ser altamente improvável, não acho que vale a pena fazer umaCount
verificação separada +Throw
ouTry
-Catch
-Throw
para gerar um erro fatal mais amigável, mas ainda assim um erro fatal.SS 2005-:
SS 2008+:
Então:
fonte
Throw
Exception
. Como você disse, não é "'provável'" que aconteça, então IMHO, não valeu um todoTry
-Catch
ou umaCount
verificação separada para gerar um erro fatal mais amigável, mas independentemente, eu provavelmente gostaria de um erro fatal. Eu acredito e acredito que seja "a melhor prática" levar em consideração todos os resultados de retorno possíveis, por mais improváveis que sejam, e mesmo que seja apenas para gerar uma exceção fatal, porque os efeitos conhecidos de interromper o processamento são geralmente melhores do que os efeitos em cascata desconhecidos do não-trapping erros.Select
,Insert
,Update
ouDelete
Declaração retornou / afetou mais ou menos do que o esperado # de linhas no entanto improváveis. Mesmo se houver (há)Unique
Index
atualmente garantindo o número esperado (ou seja, 1) de linhas a serem retornadas / afetadas, isso poderia mudar (acidentalmente ou (imprevisivelmente) "'intencionalmente'") no futuro.Se o layout dos componentes permitir, isso também funciona.
fonte