Как мне запросить, существует ли схема базы данных

StackOverflow https://stackoverflow.com/questions/226042

  •  03-07-2019
  •  | 
  •  

Вопрос

Как часть нашего процесса сборки, мы запускаем скрипт обновления базы данных по мере развертывания кода в 4 различных средах.Кроме того, поскольку один и тот же запрос будет добавляться до тех пор, пока мы не запустим релиз в производство, он имеет чтобы иметь возможность запускать несколько раз в данной базе данных.Вот так:

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

В настоящее время у меня есть инструкция create schema в сценарии развертывания / сборки.Где я могу запросить наличие схемы?

Это было полезно?

Решение

Вы ищете 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

СС 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

Это старое, поэтому я чувствую себя обязанным добавить: Для SQL SERVER 2008+ Все это работает (для выбранной части), затем используйте 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
scroll top