源代码管理中的存储过程/数据库架构

Dan*_*ana 68 database sql-server version-control

你们在你选择的源代码管理系统中跟踪存储过程和数据库架构吗?

当您进行更改(添加表,更新存储过程,如何将更改导入源代码管理?

我们在工作中使用SQL Server,并且我已经开始使用darc进行版本控制,但我对一般策略以及任何方便的工具都很好奇.

编辑:哇,谢谢所有伟大的建议,伙计们!我希望我能选择多个"已接受的答案"!

Rob*_*son 43

我们选择编写所有脚本,包括所有存储过程和架构更改.没有所见即所得的工具,也不需要花哨的"同步"程序.

架构更改很简单,您只需要为该版本创建和维护单个文件,包括所有架构和数据更改.这将成为您从版本x到x + 1的转换脚本.然后,您可以针对生产备份运行它,并将其集成到"每日构建"中,以验证它是否正常运行.请注意,重要的是不要更改或删除已经编写的模式/数据加载sql,因为您最终可能会破坏以后编写的任何sql.

-- change #1234
ALTER TABLE asdf ADD COLUMN MyNewID INT
GO

-- change #5678
ALTER TABLE asdf DROP COLUMN SomeOtherID
GO
Run Code Online (Sandbox Code Playgroud)

对于存储过程,我们为每个sproc选择一个文件,并使用drop/create表单.在部署时重新创建所有存储过程.缺点是如果在源代码管理之外进行了更改,则更改将丢失.同时,对于任何代码都是如此,但您的DBA需要注意这一点.这确实会阻止团队外的人员使用您的存储过程,因为他们的更改会在升级过程中丢失.

使用Sql Server,语法如下所示:

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[usp_MyProc]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [usp_MyProc]
GO

CREATE PROCEDURE [usp_MyProc]
(
    @UserID INT
)
AS

SET NOCOUNT ON

-- stored procedure logic.

SET NOCOUNT OFF

GO  
Run Code Online (Sandbox Code Playgroud)

剩下要做的唯一事情就是编写一个实用程序来整理所有单个文件,并使用整个更新集创建一个新文件(作为单个脚本).通过首先添加架构更改然后递归目录结构并包括所有存储过程文件来执行此操作.

作为编写脚本的好处,您将更好地阅读和编写SQL.您还可以使整个过程更加精细,但这是如何在没有任何特殊软件的情况下对所有sql进行源代码控制的基本格式.

附录:Rick是正确的,您将失去对DROP/CREATE存储过程的权限,因此您可能需要编写另一个脚本才能重新启用特定权限.此权限脚本将是最后运行的脚本.我们的经验发现ALTER与DROP/CREATE语义有关的问题.因人而异


Man*_*anu 8

在Visual Studio中创建"数据库项目"以编写和管理您的sQL代码,并将项目与版本控制一起保留在解决方案的其余部分中.


jap*_*ock 8

我们上一份工作中使用的解决方案是将脚本编号添加到源代码控制中:

01.CreateUserTable.sql
02.PopulateUserTable
03.AlterUserTable.sql
04.CreateOrderTable.sql

我们的想法是,我们始终知道运行脚本的顺序,并且我们可以避免必须管理在您尝试修改脚本#1时可能出现的数据完整性问题(这可能会导致#2中的INSERT失败).


Adr*_*uat 5

我认为您应该编写一个脚本来自动设置数据库,包括任何存储过程。然后应将该脚本置于源代码管理中。


Ric*_*ick 5

在SQL Server中删除/创建脚本时要记住的一件事是对象级权限将丢失.我们改变了标准,改为使用ALTER脚本来维护这些权限.

还有一些其他注意事项,例如删除对象会丢弃sp_depends使用的依赖记录,而创建对象只会创建该对象的依赖项.因此,如果删除/创建视图,sp_depends将不再知道引用该视图的任何对象.

故事的道德,使用ALTER脚本.


ice*_*ava 5

我同意(并赞成)罗伯特保尔森的做法.这是假设您掌握了一个开发团队的责任和纪律,以坚持这样的做法.

为了"强制"到我的团队,我们的解决方案至少从Visual Studio Team Edition for Database Professionals维护一个数据库项目.与解决方案中的其他项目一样,数据库项目获得版本控制.它使得将数据库中的所有内容分解为可维护的块,这是一个自然的开发过程,在此过程中"训练"我的团队.

当然,作为一个Visual Studio项目,它不是完美的.你会遇到很多可能会让你感到沮丧或困惑的怪癖.在完成任务之前,需要了解项目的工作原理.例子包括

但是对于没有对数据库对象进行版本控制的团队,这是一个良好的开端.另一个着名的替代方案当然是Red Gate的SQL Server产品套件,大多数使用它们的人都认为它优于微软的产品.