将Stored Proc检查到源代码管理中:要检入什么?

时间:2011-05-26 01:25:41

标签: sql-server version-control stored-procedures

我有一些我希望受源代码控制的SP,但问题是我要添加什么?

理想情况下,我想要一些方法来纯粹获取SP的来源,但是我能得到的只是改变,创建等脚本,我不认为它们是原始来源。我能得到的最接近的是运行sp_helptext'mysp'。

有没有办法纯粹获得SP的来源?

我正在运行SQL Server 2008 R2。

编辑:我理解能够获取源代码控制中的内容以及更新/部署SP的有用性,但是我坚决反对这一点。这个代码在情境上是有用的,在制作差异以查看更改和通用时是无关紧要的(违反DRY原则。例如,SQL Server 2010有一种创建和删除sps的新方法..需要为我的所有SP更新'source'?)。如果我想要这样的东西,我会更倾向于制作一个将SP部署到服务器的脚本(例如,部署dp_mysp prod)。

有没有办法获得SP的胆量?或者它实际存储为创建过程脚本?

EDIT2:

干杯。

我不反对版本化设置和引用(或部署脚本,这是最好的类比IMO),因为它们存在于一个的地方,并且是可重用的善良块。关键是这个问题是许多位置存在相同的部署代码,并且必须在许多地方进行维护。这段代码与每个sp之间没有依赖关系,所以它为每个sp增加了一些东西。为什么我们不将通用部署代码添加到我们解决方案中的每个文件中,以便它们可以自部署?

无论如何,我想我们必须同意在这一点上表达不同意见。我绝对是一个纯粹主义者,我不认为我想要的东西有多少实际好处,但对于我来说,超级肛门关于发展是有趣的:)

没有人帮助我接近我想要的东西而不是sp_helptext'mysp'(我猜这是不可能的)或者说服我应该检查别的东西,所以我要留下这个问题未回答的。

再次感谢。

8 个答案:

答案 0 :(得分:2)

在我看来,您希望置于源代码管理之下的是包含if exists(...) drop后跟create procedure后跟必要权限的脚本。通过这种方式,您可以恢复到sproc在进入源代码管理时的方式。

请记住,sql语句本身并不是你应该追踪的唯一内容。

答案 1 :(得分:2)

您是否可以访问Visual Studio 2010?他们将DB Pro与Developer Edition合并,使您可以访问数据库项目和模式比较。使用这些工具,您可以轻松地以基于文件的格式提取所有表,视图,存储过程,用户定义的函数等。然后您可以将该数据库项目存储在源代码管理中。您甚至可以比较项目的不同修订版本以查看已更改的内容,更不用说部署到服务器了。

如果您没有此工具,那么您将需要编写程序脚本。在我以前的工作中,我们对创建语句很满意。

答案 2 :(得分:2)

仅在VS2010(终极)中创建数据库项目,并与本地数据库进行模式比较,并在TFS中维护存储库。这样做将保持对TFS中SP的所有更改

答案 3 :(得分:2)

在VS 2010之前,我曾经让脚本创建一个存根过程(如果尚不存在),然后使用实际代码“改变过程”:

if not exists (select * from sys.objects where name = 'myProc' and type = 'P')
begin
    exec('create procedure myProc as print ''stub''')
end
GO
alter procedure myProc as 
....

这样,在更新时,您将保留过程元数据 - 权限,创建日期等。此外,如果脚本中存在语法错误,则最终不会从数据库中删除旧版本的过程。

答案 4 :(得分:1)

我一直在做的事情是保存用于创建存储过程的脚本。这样我就可以将它们置于源头控制之下。

我在每个存储过程脚本中包含三个部分:

  1. 在脚本顶部稍加检查以删除存储过程(如果存在)(以GO结尾)

  2. 创建存储过程(以GO结尾)

  3. 然后是存储过程的任何授权列表。 (GO暗示)

  4. 这种用于创建存储过程的脚本非常棒,因为您可以连续多次运行它并且它总能正常运行而不会抛出错误或弄乱任何东西。如果你开始使用这种技术,那就容易多了。如果您从现有的一堆存储过程向后工作,则可以使用SSMS生成创建脚本,只需使用选项在创建之前包含一个drop。您还必须确保在结束时添加授权,或者每次删除并重新创建一个sproc时,用户将无法再访问它。

答案 5 :(得分:1)

如果我正确地阅读了您的问题,您只需要存储过程的主体而不是“创建过程”位。让我试着说服你,你想要整件事。在胆量之前可能发生的一些事情是:

  • “执行为”条款
  • 存储过程的参数(及其默认值)
  • “重新编译”条款

所有这些都会影响存储过程的运行方式。

答案 6 :(得分:1)

像大多数其他回答者一样,我并不真正同意你想要做的事情背后的推理 - 但是,如果你决定沿着这条路走下去,你可以从现有的程序中获得最新的对象定义。 INFORMATION_SCHEMA.ROUTINES表:

SELECT ROUTINE_DEFINITION 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_NAME = '<sp_name>'

您可以使用您喜欢的任何编程语言将其查询到文件中。 您会注意到数据库引擎本身存储CREATE PROCEDURE...

我认为这种方法可能难以维护的原因之一是值得记住会话的某些会话级设置,其中创建存储过程会影响sp函数的方式/是否 - 例如QUOTED_IDENTIFIER设置对使用XML函数的存储过程的影响 - 您需要一些方法来记录/检索每个过程的这些设置。

答案 7 :(得分:1)

您可能必须等待SQL 2011(Denali)

Micheal Otey说:

“Juneau还可以分析一组更改并生成一个脚本,该脚本将更新数据库以及您在开发环境中所做的更改所影响的所有对象。与Visual Studio一样,Juneau支持项目的概念并且可以集成使用Team Foundation Server进行源代码控制。其中一个较酷的功能是Juneau能够立即跳转到列定义或显示给定列的所有引用.Iugau的目标之一是使开发环境与SQL Azure和on -premises版本的SQL Server。“

http://www.sqlmag.com/article/sql-server/first-look-sql-server-code-named-denali

“Juneau”,SQL Server的VS2010 shell:

http://blogs.msdn.com/b/ssdt/archive/2010/11/08/welcome.aspx