Мы регистрируем все объекты нашей базы данных в системе управления версиями как повторно запускаемые сценарии (представления, функции, триггеры и хранимые процедуры и т. Д.)

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

Есть ли недостатки в создании скриптов следующим образом.

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.

Так что преимущества для меня очевидны, мне просто интересно, есть ли в этом какие-то недостатки ... кроме небольших накладных расходов на написание немного более подробных сценариев.

5
Eoin Campbell 20 Дек 2012 в 16:30
Вы, вероятно, получите несколько близких / субъективных голосов в зависимости от того, как вы это сформулировали, и в любом случае это может лучше подходить для администраторов баз данных, но я считаю это интересным решением проблемы, с которой мы столкнулись в предыдущей компании.
 – 
Joe
20 Дек 2012 в 16:33
Что ж, я думаю, я ищу законные технические "недостатки" ... т.е. есть ли какие-то технические причины для DROP/CREATE вместо ALTERING? Может ли ALTERS повлиять на планы выполнения и т. Д.
 – 
Eoin Campbell
20 Дек 2012 в 16:36
4
Жаль, что SQL Server исполнилось почти два десятилетия, а они до сих пор не успели реализовать команду CREATE OR REPLACE.
 – 
SWeko
20 Дек 2012 в 16:37
ALTER не влияет на разрешения для процессов. Если GRANT меняются с течением времени (а они меняли для нас), вам понадобится какой-то способ учесть это здесь (что может быть проще с drop / воссозданием?) Я не знаю какой-либо причины из производительности / выполнения, почему они поступил бы по-другому.
 – 
Joe
20 Дек 2012 в 16:57

1 ответ

Лучший ответ

Здесь 10-летний разработчик / архитектор SQL Server, и я не могу думать о каких-либо недостатках, кроме (относительно небольших) первоначальных затрат на создание сценария, который сделает это.

Если вы обеспокоены тем, что план, скомпилированный как тривиальный во время создания, не перекомпилируется при изменении процедуры, вы можете добавить явный вызов SP_RECOMPILE для каждого из них, но у меня никогда не было этой проблемы с SQL Server (у меня была это с DB2), так что я думаю, что это чрезмерная осторожность.

Это интересный и, на мой взгляд, полезный подход.

2
DeanGC 20 Дек 2012 в 16:57
1
SQL Server не составляет план во время создания SP. Он анализируется во время создания, но компилируется при первом выполнении, и запуск ALTER PROC в любом случае сделает недействительными любые кэшированные планы.
 – 
Martin Smith
20 Дек 2012 в 17:06
Вы, конечно, правы. :) Наверное, не стоило говорить «во время создания». Я столкнулся с этим, когда платформы приложений выполняют хранимые процедуры при компиляции и компоновке, и только с DB2. Как я уже сказал, я думаю, что это чрезмерная осторожность - это действительно единственное возражение или предостережение, с которым я мог бы выступить.
 – 
DeanGC
20 Дек 2012 в 19:03
Спасибо за отзыв, Дин и Мартин. ~ EoinC
 – 
Eoin Campbell
22 Янв 2013 в 19:04