Sql server 如何将存储过程添加到版本控制

Sql server 如何将存储过程添加到版本控制,sql-server,version-control,stored-procedures,Sql Server,Version Control,Stored Procedures,我们的团队第一次经历了没有DB版本控制的麻烦。我们如何至少在版本控制中添加存储过程?我们正在开发的当前系统主要依赖于SPs。我们只是在.sql文件中将CREATE语句添加到源代码管理中,例如: -- p_my_sp.sql CREATE PROCEDURE p_my_sp AS -- Procedure 确保每个文件只放置一个SP,并且文件名与过程名完全匹配(这样可以更容易地在源代码管理中找到过程) 然后,您只需要遵守规则,不要将非源代码管理的存储过程应用于数据库 另一种方法是将SP另

我们的团队第一次经历了没有DB版本控制的麻烦。我们如何至少在版本控制中添加存储过程?我们正在开发的当前系统主要依赖于SPs。

我们只是在.sql文件中将
CREATE
语句添加到源代码管理中,例如:

-- p_my_sp.sql
CREATE PROCEDURE p_my_sp
AS
    -- Procedure
确保每个文件只放置一个SP,并且文件名与过程名完全匹配(这样可以更容易地在源代码管理中找到过程)

然后,您只需要遵守规则,不要将非源代码管理的存储过程应用于数据库


另一种方法是将SP另存为
ALTER
语句-这样做的好处是更容易更新现有数据库,但这意味着您需要做一些调整来创建一个新的空数据库。

我认为最好将每个存储过程编写到一个单独的.sql文件中,然后将这些文件提交到源代码管理中。任何时候更改存储过程时,都要更新创建脚本—这将为您提供逐个存储过程的完整版本历史记录


有一些SQL Server源代码管理工具连接到SSM,但我认为它们只是编写db对象的脚本并提交这些脚本。例如,《红门》今年就要上市了。

背景:我开发了一个拥有近2000个存储过程的系统

我发现的关键问题是将数据库作为一个应用程序来处理。您永远不会直接用十六进制编辑器打开EXE并对其进行编辑。数据库也是如此;仅仅因为您可以从数据库编辑存储过程,并不意味着您应该这样做

将源代码管理中存储过程的副本视为当前版本。这是你的源代码。签出、编辑、测试、安装并签入。下次必须更改时,请遵循相同的步骤。正如应用程序需要构建和部署过程一样,存储过程也应该如此

下面的代码是此过程的良好存储过程模板。它处理更新(
ALTER
)或新安装(
CREATE
)两种情况

但是,在控制对存储过程的访问的情况下,下面的示例更好。
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之类的工具来比较这两个数据库并识别差异。 调和分歧


更便宜的解决方案是简单地使用SQLManagementStudio的“脚本作为”功能并进行文本比较。但是,这种方法对SSMS用于格式化提取的SQL的确切方法非常敏感。

我一直在使用这种工具来实现这一目的


确保没有人忘记签入更新的.sql文件的方法是使生成服务器强制登台和实时环境与源代码管理相匹配;-)(此工具将为您提供帮助)。

我肯定会推荐一些集成到SSMS中的第三方工具。除了上面提到的SQL源代码控制之外,您还可以从Apex尝试


重要的是,如果您想让开发人员使用它,就要让它变得非常容易,最好的方法是使用集成到SSM中的工具

来自@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
如果不存在(从sysobjects中选择名称
其中name='',type='P',uid='1')
EXEC sp_executesql N'CREATE PROCEDURE dbo。
作为
开始
选择“未实现”
结束
'
去
改变程序dbo。
作为
开始
--存储过程代码
终点

这真是太好了,因为我没有丢失存储过程权限。

类似的帖子:它们有时会被保存,但也有一些情况表明并非所有程序员都一直记得这一点。有趣的是,我以前从未遇到过RedGate。我来看看。要控制住每个人是很难的though@Darryl-SQL Server不喜欢第二个示例,因为“CREATE PROCEDURE”需要是批处理中的第一条语句。另一个更便宜的选项是JetBrains的PhpStorm(可能还有他们的*Storm列表中的其他),它包含了一个非常好的数据库比较工具。它还是一个不错的编辑器,具有针对各种SQL风格的自动完成功能。
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