Source Control and stored procedures
我一直在想如何将所有存储过程放在源代码控制下的SQL 2000上。
我们正在使用Subversion来处理所有正常的源代码,所以如果使用Subversion解决问题会很好。
你有什么想法?
更新16-02-2009:这是我用于导出所有存储过程的vbs脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | SET con = CreateObject("ADODB.Connection") con.ConnectionString ="*** Database connection string here ***" con.Open SET rs = CreateObject("ADODB.RecordSet") rs.ActiveConnection = con strSQL ="SELECT ROUTINE_NAME, ROUTINE_DEFINITION" & _ "FROM INFORMATION_SCHEMA.routines" & _ "WHERE ROUTINE_NAME NOT LIKE 'dt_%'" & _ "ORDER BY 1" SET fso = CreateObject("Scripting.FileSystemObject") rs.Open strSQL While NOT rs.Eof filename = rs("ROUTINE_NAME") &".sql" routineSQL = rs("ROUTINE_DEFINITION") SET tf = fso.CreateTextFile(filename, TRUE) tf.Write routineSQL tf.Close SET tf = Nothing rs.MoveNext Wend SET fso = Nothing rs.Close SET rs = Nothing |
通常,您可以跟踪源代码管理中对SQL脚本的更改。
例如,您有一个签入您的数据库的基础架构。
然后,您不断添加新的SQL文件以更改架构。这样,您可以部署到精确版本以进行测试。然后,您可以使用构建自动化来自动测试一些脚本,方法是在测试数据库中使用实际数据执行这些脚本。
有很多数据库差异工具可以帮助您解决版本之间的变化。
正如其他人所说的那样,从处于源代码管理下的独立文本文件开始,将每个存储过程开始。编写一个脚本,删除所有存储过程,然后从文本文件中重新创建它们(同时记录/报告任何错误) - 此脚本应该易于运行。然后每次从源代码管理器更新时重新运行脚本。应对文本文件进行对存储过程的所有编辑,而不是对本地数据库的"实时"副本进行编辑,否则在执行更新时将丢失更改。
您很快就会想要审核数据库模式并创建升级脚本等。
如果您只使用SQL Server,请考虑从Reg-Gate进行SQL Compare。我认为它会将文本文件中的存储过程(和其他sql)与数据库中的内容进行比较并同步这两者。因此,让您使用SqlServer中的编辑工具来编辑实时存储过程。
(截至2009年底,Red-Gate即将发布Sql Compare for Oracle)
有人告诉我,ApexSQL的Diff工具是另一种选择,而不是Sql Compare,ApexSQL的Edit声称提供源代码控制集成。
在高端考虑Visual Studio Team System数据库版本,但是它花费了很多,那么您可能需要为第三方的Oracle支持支付更多费用。但如果你是微软的合作伙伴(或者可以成为合作伙伴),你可能会非常便宜地得到一些应对。
另请参阅您是否控制数据库?在StackOverflow上获得关于更大问题的一组好答案。
将所有存储过程编写到一个文件夹中。每个存储过程一个文件。
然后简单地将该文件夹放在源代码管理下,就像您对其他源代码一样。
如果有批处理文件或类似文件将这些存储过程附加在一起,它也会有所帮助,这将是您的"升级数据库到最新版本"脚本。
有一些方法可以管理数据库本身的存储过程,但我发现这是最简单的方法。
请参阅Josef的解决方案:版本控制SQL Server存储过程的最佳方法是什么?
他有一个自动创建脚本文件的工具,然后可以将其签入SVN(或任何其他存储库)。
除了Red Gate的SQL Compare之外,还可以考虑使用ApexSQL的Diff工具来检查数据库之间的结构差异。您可能还需要考虑集成源代码管理的管理工具。 ApexSQL的Edit提供了源代码控制集成。