В рамках нашего процесса сборки мы запускаем сценарий обновления базы данных по мере развертывания кода в 4 различных средах. Кроме того, поскольку один и тот же запрос будет добавлен до тех пор, пока мы не запустим выпуск в производство, он должен иметь возможность запускаться несколько раз в данной базе данных. Как это:
IF NOT EXISTS (SELECT * FROM sys.tables WHERE object_id = OBJECT_ID(N'[Table]'))
BEGIN
CREATE TABLE [Table]
(...)
END
В настоящее время у меня есть оператор создания схемы в сценарии развертывания / сборки. Где мне узнать о существовании схемы?
sql-server-2005
schema
Pulsehead
источник
источник
Ответы:
Вы ищете sys.schemas ?
Обратите внимание, что он
CREATE SCHEMA
должен запускаться в отдельном пакете (согласно ответу ниже )источник
SELECT 1/0...
@bdukes прав на деньги, чтобы определить, существует ли схема, но приведенный выше оператор не будет работать в SQL Server 2005.
CREATE SCHEMA <name>
необходимо запускать в собственном пакете. Обходной путь - выполнитьCREATE SCHEMA
инструкцию в exec.Вот что я использовал в своих сценариях сборки:
источник
Это устарело, поэтому я чувствую себя обязанным добавить: Для SQL SERVER 2008+ Все они работают (для выбранной части), а затем использовать
EXECUTE('CREATE SCHEMA <name>')
для ее создания при отрицательных результатах.источник
IF schema_id ('MySchemaName') IS NULL
работает хорошо и кажется немного более удобным, чем принятый ответ.Чтобы быть дополнительной «защитной», следующая версия генерирует ошибку преобразования типа, чтобы учесть возможность (хотя и маловероятную) совпадения> 1
Schema
аналогично тому, как код проверки часто намеренно выдает исключение, потому что я считаю, что это хорошо, и я считаю, что «лучшая практика» для учета всех возможных результатов возврата, какими бы маловероятными они ни были, и даже если это просто создание фатального исключения, потому что известные эффекты остановки обработки обычно лучше, чем неизвестные каскадные эффекты невыявленных ошибок. Поскольку это маловероятно, я не думал, что стоит тратить силы на отдельнуюCount
проверку +Throw
илиTry
-Catch
-Throw
для создания более удобной фатальной ошибки, но, тем не менее, фатальной ошибки.SS 2005-:
SS 2008+:
Затем:
источник
Throw
Exception
. Как вы сказали, что это не «„вероятно“ , » должно произойти, так имхо, не стоит в целомTry
-Catch
или отдельныйCount
чек , чтобы создать более удобный фатальную ошибку, но независимо от того , я, скорее всего , хочу фатальную ошибку. Я верю и считаю, что это «лучшая практика» - учитывать все возможные результаты возврата, даже если они маловероятны, и даже если это просто приводит к фатальному исключению, потому что известные эффекты остановки обработки обычно лучше, чем неизвестные каскадные эффекты невыловленных ошибки.Select
,Insert
,Update
илиDelete
заявление возвращено / пострадавшие более или менее , чем ожидалось # строк , однако вряд ли. Даже если есть (есть) вUnique
Index
настоящее время обеспечение ожидаемого количества (т.е. 1) строк, которые будут возвращены / затронуты, это может измениться (случайно или (недальновидно) «намеренно») в будущем.Если расположение компонентов позволяет, это тоже работает.
источник