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

Наша команда просто испытала в первый раз проблему отсутствия контроля версий для нашей БД. Как добавить хранимые процедуры, по крайней мере, к управлению версиями? Текущая система, которую мы разрабатываем, опирается главным образом на SP.

Ответ 1

Справочная информация. Я разрабатываю систему с почти 2000 хранимыми процедурами.

Критическая вещь, которую я нашел, - рассматривать базу данных как приложение. Вы никогда не открывали бы EXE с шестнадцатеричным редактором напрямую и не редактировали бы его. То же самое с базой данных; просто потому, что вы можете редактировать хранимые процедуры из базы данных, это не значит, что вы должны.

Рассматривайте копию хранимой процедуры в исходном контроле как текущую версию. Это ваш исходный код. Проверьте его, отредактируйте, протестируйте, установите и верните его. В следующий раз, когда его нужно изменить, выполните ту же процедуру. Так же, как приложение требует процесса сборки и развертывания, так же как и хранимые процедуры.

Нижеприведенный код является хорошим шаблоном хранимой процедуры для этого процесса. Он обрабатывает оба случая обновления (ALTER) или новую установку (CREATE).

IF EXISTS(SELECT name
            FROM sysobjects
           WHERE name = 'MyProc' AND type = 'P' AND uid = '1')
   DROP PROCEDURE dbo.MyProc
GO

CREATE PROCEDURE dbo.MyProc
AS

GO

Однако следующий пример лучше в ситуациях, когда вы контролируете доступ к хранимым процедурам. Метод DROP - CREATE теряет GRANT информацию.

IF NOT EXISTS(SELECT name
            FROM sysobjects
           WHERE name = 'MyProc' AND type = 'P' AND uid = '1')
   CREATE PROCEDURE dbo.MyProc
   AS
   PRINT 'No Op'
GO

ALTER PROCEDURE dbo.MyProc
AS

GO

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

Создайте новую базу данных из исходного элемента управления. Используйте инструмент, подобный Red Gate SQL Compare, для сравнения двух баз данных и определения различий. Сопоставьте различия.

Более дешевое решение - просто использовать функциональность "Script As" SQL Management Studio и сравнить текст. Однако этот метод очень чувствителен к точному методу, который SSMS использует для форматирования извлеченного SQL.

Ответ 2

Идентификатор определенно рекомендует использовать сторонний инструмент, который интегрируется в SSMS. Помимо упомянутого выше SQL Source Control, вы также можете попробовать SQL Version из Apex.

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

Ответ 3

Я думаю, что хорошо, чтобы каждая хранимая процедура была написана в отдельном файле .sql, а затем просто передала эти файлы в исходный элемент управления. Каждый раз, когда sproc изменяется, обновляйте создание script - это дает вам полную версию истории на sproc по базе sproc.

Есть инструменты управления исходными текстами SQL Server, которые подключаются к SSMS, но я думаю, что они просто обрабатывают объекты db и записывают эти сценарии. Red Gate выглядит как выпускает такой инструмент в этом году, например.

Ответ 4

Мы просто добавляем инструкцию CREATE к исходному элементу в файле .sql, например:

-- p_my_sp.sql
CREATE PROCEDURE p_my_sp
AS
    -- Procedure

Убедитесь, что вы поместили только один SP для каждого файла и имя файла точно соответствует имени процедуры (это упрощает поиск процедуры в исходном элементе управления)

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

Альтернативой было бы сохранить SP как инструкцию ALTER вместо этого - это имеет преимущество, упрощая обновление существующей базы данных, но означает, что вам нужно сделать некоторую настройку для создания новой пустой базы данных.

Ответ 5

Я работал над этим инструментом http://timabell.github.com/sqlHawk/ именно для этой цели.

Способ гарантировать, что никто не забывает проверять свои обновленные файлы .sql, заставляя ваш сервер сборки заставлять среду компоновки и жить в соответствии с контролем источника;-) (который этот инструмент вам поможет).

Ответ 6

Второе решение от @Darryl не работает, как было предложено @Moe. Я изменил шаблон @Darryl, и я получил его работу, и подумал, что было бы неплохо поделиться им со всеми.

IF NOT EXISTS(SELECT name FROM sysobjects
              WHERE name = '<Stored Proc Name>' AND type = 'P' AND uid = '1')   
    EXEC sp_executesql N'CREATE PROCEDURE dbo.<Stored Proc Name>
    AS
    BEGIN
        select ''Not Implemented''
    END
    '
GO

ALTER PROCEDURE dbo.<Stored Proc Name>
AS  
BEGIN
  --Stored Procedure Code 
End

Это действительно приятно, потому что я не теряю права на доступ к хранимой процедуре.