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

Jon*_*onn 23 sql-server version-control stored-procedures

我们的团队第一次遇到了没有版本控制的麻烦.我们如何才能将存储过程至少添加到版本控制中?我们正在开发的当前系统主要依赖于SP.

小智 20

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

我发现的关键是将数据库视为一个应用程序.您永远不会直接使用十六进制编辑器打开EXE并进行编辑.与数据库相同; 只是因为你可以从数据库编辑存储过程并不意味着你应该.

治疗存储过程的拷贝在源控制作为所述当前版本.这是你的源代码.检查,编辑,测试,安装,然后重新检查.下次必须更改时,请按照相同的步骤进行操作.正如应用程序需要构建和部署过程一样,存储过程也应如此.

下面的代码是此过程的良好存储过程模板.它处理update(ALTER)或new install(CREATE)的两种情况.

IF EXISTS(SELECT name
            FROM sysobjects
           WHERE name = 'MyProc' AND type = 'P' AND uid = '1')
   DROP PROCEDURE dbo.MyProc
GO

CREATE PROCEDURE dbo.MyProc
AS

GO
Run Code Online (Sandbox Code Playgroud)

但是,在您控制对存储过程的访问权限的情况下,以下示例更好.本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
Run Code Online (Sandbox Code Playgroud)

此外,创建一个完全从源代码控制构建数据库的过程可以帮助控制事物.

从源代码管理创建新数据库.使用Red Gate SQL Compare之类的工具来比较两个数据库并识别差异.协调差异.

更便宜的解决方案是简单地使用SQL Management Studio的"脚本为"功能并进行文本比较.但是,此方法对SSMS用于格式化提取的SQL的确切方法非常敏感.

  • @Darryl - SQL Server 不会喜欢第二个示例,因为“CREATE PROCEDURE”需要是批处理中的第一个语句。 (3认同)

小智 5

我肯定会推荐一些集成到SSMS中的第三方工具.除了上面提到的SQL Source Control,您还可以尝试Apex的SQL版本.

重要的是,如果您希望它们使用它,那么对于开发人员来说这非常容易,最好的方法是使用集成到SSMS中的工具.


Yog*_*dal 5

@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
Run Code Online (Sandbox Code Playgroud)

这真的很好,因为我不会失去存储过程权限。