Наша команда просто испытала в первый раз проблему отсутствия контроля версий для нашей БД. Как добавить хранимые процедуры, по крайней мере, к управлению версиями? Текущая система, которую мы разрабатываем, опирается главным образом на 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
Это действительно приятно, потому что я не теряю права на доступ к хранимой процедуре.