源代码控制下的存储过程,最佳实践


16

我目前正在使用Tortoise SVN来对.NET Web应用程序进行源代码控制。将我们的SQL Server存储过程纳入Source Control的最佳方法是什么?我目前使用VS 2010作为开发环境,并使用SQL Server数据工具(SSDT)连接到内部SQL Server 2008 R2数据库。

我过去所做的就是将procs保存到.sql文件,并将此文件置于源代码控制下。我确定必须有比这更有效的方法?我可以在生产计算机上的VS2010,SSDT甚至SQL Server上安装扩展吗?


2
如果您在Visual Studio中使用SSDT项目类型,则将该项目添加到源代码管理中。而已。
Mark Storey-Smith

1
请阐明您的目标-您只是在寻找数据库对象的版本控制,还是试图将其用作部署平台?
乔恩·塞格尔

Answers:


14

有一些工具,例如Redgate的工具,但是我一直发现最好的办法是将SQL文件保存为您的解决方案中的一个数据库项目(SSDT?)。

同时,我建议以下准则:

  • 始终假定SVN版本为“当前” /“最新”
  • 确保您运行的每个脚本if exists then drop在开始时都具有适当的“ ”
  • 记住编写权限脚本(如果有)

您可以最初通过直接从SSMS编写脚本来创建这些SQL文件,并且可以将SSMS设置为对所有“ drop”和“ create”以及权限进行脚本编写。


我没有意识到数据库项目类型,只是刚刚开始探索SSDT,但这看起来很有希望。我之所以选择此解决方案,是因为它不依赖于第三方工具,而且我可以轻松地将.sql文件放入当前的源代码管理中。
QFDev

也不允许对产品上的开发者使用权限,而那些具有权限的开发者只能从源代码控制中部署。
HLGEM

3
如果更改其他视图/过程引用的表/视图,请小心“如果存在,请删除它们,然后用新定义重新创建”。我遇到过这样的情况,由于查询计划被重用而不用假设先前的结构重新编译,因此此类从属视图的输出已损坏(列类型和内容已移动,但名称未更改)。一个更安全的选择是“如果不存在,则创建虚拟对象”,然后是“更改表/视图/进程”,因为alter将遵循sysdepends记录使计划无效,而drop + create不会删除此类记录,并且create不会扫描悬挂的参考。
David Spillett 2014年

如果您在版本控制中有触发器,@ DavidSpillett的评论就显得尤为重要,因为即使在死锁时drop + create也会失败,create dummy + alter不应发生
James Z

4

将SQL文件保存在源代码控制中仅提供对SQL文件的控制。它不能控制实际数据库对象的更改,也不能防止多个用户同时更改同一数据库对象(我想您也希望对此进行控制)。我们使用的是第三方工具(ApexSQL版本),它与SSMS和VS集成在一起,您可以选择是使用对象的数据库版本还是源代码控制版本。如果您正在编辑数据库版本,则该数据库版本只会自动签出给您,因此其他任何人都无法编辑它(它不会合并来自不同用户的更改)。仅当您再次签入时,其他人才能对其进行修改。而且您可以将SC版本与活动对象的版本不同(我在白天使用时打算使用该版本,并计划完成编辑并在下一次进行测试)



3

试试Ankhsvn,强烈推荐它免费。

从首页:

AnkhSVN是Microsoft Visual Studio 2005、2008、2010 和2012的Subversion源代码控制提供程序。

AnkhSVN为Visual Studio支持的所有项目类型提供Apache™Subversion®源代码管理支持,并允许您直接从Microsoft Visual Studio IDE内部执行最常见的版本控制操作。

Pending Changes仪表板为您提供了开发过程中的独特见解,并提供了对源代码和问题管理功能的轻松访问。深度源代码控制(SCC)集成使您可以专注于开发,而AnkhSVN可以跟踪所有更改并为您提供有效处理特定需求的工具。


3

我已经尝试过RedGate和Visual Studio的数据库项目,并且我更喜欢将数据库定义存储在数据库项目中。一旦数据库成为解决方案的一部分,您就可以使用首选的源代码控制提供程序。大多数都具有出色的Visual Studio集成。

使用SSDT工具,您可以获得数据库定义的“最新版本”,从而可以轻松进行模式比较并生成模式升级脚本。

也就是说,模式通常只是等式的一部分。在现实生活中,事实证明,已经有许多数据库。当我的用户松开它时,他们会感到非常失望。

因此,一旦我推出v1.0,就需要维护升级脚本。有时这些只是包含架构更改,但是很多时候我需要根据其他表的内容创建默认值,需要释放特定的约束,直到我为数据添加种子等。通常仅升级架构并不能完全削减它。我的首选是也将这些升级脚本也放在数据库项目的单独文件夹中。这些通常看起来像是“从v1.0升级到v1.1”。

我的数据库始终都有一个引用表,该表可以告诉我当前的版本号,因此我可以阻止不兼容的升级。升级脚本中的第一条语句将检查当前版本,并检查其是否与预期版本不同。

数据库项目的另一个好处是能够基于同一模式部署不同的数据集。我有不同的数据集用于开发,质量检查团队,用户接受测试和自动集成测试。由于一个数据库项目只能有1个部署后脚本,因此这里的技巧是创建一个引用“主”项目的新数据库项目,并使自定义数据集成为该项目的部署后过程的一部分。

这是我的2美分,无论您提出什么要求,最重要的是,它必须适合您和您的团队,并希望在大多数常见任务中为您提供支持。


0

我最终自己写了一个工具。

可以免费下载-http: //www.gitsql.net

我希望它对希望实现相同最终目标的其他人有所帮助。

本文是描述如何对SQL Server进行源代码控制的文章。http://gitsql.net/documentation-04_SQL_Server_and_GIT

我试图使其尽可能容易。(3个画面)

  • 连接到SQL Server
  • 选择对象
  • 选择要导出到/ import的文件夹

我也偶然地添加了能够选择性地选择要导入或导出的单个对象的功能。这使得开发过程变得很容易。

我通常会更改存储过程和表,然后将这两个对象导出到GIT目录。

然后,我使用Source Tree直观地查看更改,然后在感到高兴的情况下将其提交到bitbucket中。


4
免费下载-但仅适用于20个对象。这个答案只是您产品的广告。
Thronk

-1

我公司刚刚开发了这个新工具免费),可以帮助您轻松提取 SQL数据库的脚本,进行比较启动WinMerge以便将脚本与实时数据库进行快速比较,还可以同步更新脚本或应用更改之间的差异。到数据库(表除外,这将涉及更多的复杂性和更多的风险)。

Servantt是WinMerge,用于将SQL Server数据库与版本控制脚本进行比较。

它支持并鼓励软件开发的最佳实践:

  • 使数据库对象受版本控制(*)
  • 删除开发人员在生产环境中的访问权限
  • DBA对性能瓶颈和命名标准的过程/视图更改的审查
  • 使用完全限定的标识符和方括号定界符命名对象(它修复了CREATE PROCEDURE / VIEW / FUNCTION / etc脚本)

(*)脚本保存在本地文件夹中,该文件夹可以是Git,Subversion,TFS,Source Safe或任何其他VCS的工作副本。

免费下载:http : //servantt.com

专业版(仍在开发中)将是完全不同的野兽-它针对部署自动化(版本管理),用于自动化任务,例如更新IIS,更新Windows Services等。


该工具不起作用。
Neeraj Kumar

@NeerajKumar在页面中有一个“联系我们”地址,您可以在其中描述您的问题。我很乐意提供帮助。有超过一千个活跃用户,我认为它在某种意义上是
可行的
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.