Мы регистрируем все объекты нашей базы данных в системе управления версиями как повторно запускаемые сценарии (представления, функции, триггеры и хранимые процедуры и т. Д.)
Когда приходит время развертывания, нам нужно убедиться, что все сценарии можно повторно запускать и воспроизводить, чтобы хранимая процедура была создана / обновлена до последней версии.
Есть ли недостатки в создании скриптов следующим образом.
IF NOT EXISTS
(
SELECT *
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_SCHEMA = 'dbo'
AND ROUTINE_NAME = 'MyStoredProcedure'
)
BEGIN
EXEC ('CREATE PROCEDURE [dbo].[MyStoredProcedure] AS SELECT 1')
-- ALSO DO ANY INITIAL GRANT PRIVILEGE SCRIPTING HERE
END
GO
ALTER PROCEDURE [dbo].[MyStoredProcedure] (
@param1 INT,
@param2 NVARCHAR(50) = 'Default String'
)
AS
BEGIN
-- DO SOMETHING WITH @param1 AND @param2
SELECT 1;
END
GO
По сути, сценарий проверяет, существует ли объект в соответствующем системном представлении, и, если он не существует, некоторый динамический sql создает его как заглушку, чтобы обойти проблемы с оператором CREATE PROCEDURE/GO
, недопустимые в условных блоках. Затем он применяет фактическую функциональность сценария через ALTER
.
Так что преимущества для меня очевидны, мне просто интересно, есть ли в этом какие-то недостатки ... кроме небольших накладных расходов на написание немного более подробных сценариев.
1 ответ
Здесь 10-летний разработчик / архитектор SQL Server, и я не могу думать о каких-либо недостатках, кроме (относительно небольших) первоначальных затрат на создание сценария, который сделает это.
Если вы обеспокоены тем, что план, скомпилированный как тривиальный во время создания, не перекомпилируется при изменении процедуры, вы можете добавить явный вызов SP_RECOMPILE для каждого из них, но у меня никогда не было этой проблемы с SQL Server (у меня была это с DB2), так что я думаю, что это чрезмерная осторожность.
Это интересный и, на мой взгляд, полезный подход.
ALTER PROC
в любом случае сделает недействительными любые кэшированные планы.
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.
DROP/CREATE
вместоALTERING
? Может лиALTERS
повлиять на планы выполнения и т. Д.