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
但是,在您控制对存储过程的访问权限的情况下,以下示例更好.本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之类的工具来比较两个数据库并识别差异.协调差异.
更便宜的解决方案是简单地使用SQL Management Studio的"脚本为"功能并进行文本比较.但是,此方法对SSMS用于格式化提取的SQL的确切方法非常敏感.
@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
这真的很好,因为我不会失去存储过程权限。