Как мне запросить, существует ли схема базы данных
-
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