如何管理SQL源代码?

时间:2009-02-21 11:59:13

标签: sql version-control stored-procedures project-management

我负责数据库。 它有大约126个sprocs,大约20个视图,一些UDF。有些表可以为我们的各种应用程序保存固定的配置数据。

我一直在使用一个包含IF EXIST ... DELETE GO CREATE PROCEDURE的大文本文件,用于配置脚本的所有sprocs,udfs,views和所有插入/更新。

随着时间的推移,新的sprocs被添加,或现有的sprocs被改变。

我创建这个BIG单文本文件的最大错误(据我所知)是在文本文件的开头使用新的/更改的sprocs的代码。但是,我忘了为新的/更改的sprocs排除以前的代码。让我们说明一下:

说我的BIG脚本(版本1)包含创建sprocs的脚本

sp 1
sp 2
sp 3
view 1
view 2

数据库的版本表随版本1更新。

现在sp 2发生了一些变化。所以BIG脚本的版本2现在是:

sp2 --> (newly added)
sp1
sp2
sp3
view 1
view 2

因此,显然运行BIG脚本版本2将不会更新我的sp 2。

我已经很晚才意识到这种情况已经超过了100多个。

补救行动:

  1. 我创建了一个文件夹结构。每个sproc / view的一个子文件夹。

  2. 我从bgeinning中浏览了最新版本的BIG脚本,并将所有脚本的代码放入相应的文件夹中。某些脚本在BIG脚本中重复多次。如果有超过用于创建特定sproc的代码块,我将早期版本放入该sproc的文件夹中名为“old”的另一个子文件夹中。幸运的是,我总是记录了我对所有sprocs / view等所做的所有更改 - 我写下了日期,版本号以及在sproc的代码中作为注释所做的更改的描述。当sprocs有多个代码块时,这对我来说很有帮助,可以找出最新版本的代码。

  3. 我创建了一个DOS批处理过程来连接所有单个脚本以创建我的BIG脚本。我尝试过使用.net streamreader / writer,它与编码和“£”符号混淆。所以我暂时坚持使用DOS批处理。

  4. 有什么办法可以改善整个过程吗? 目前,我正在以某种方式记录BIG脚本的版本控制以及其各自的sproc版本。例如,我希望有一些方法来记录

    Big Script (version 1) contains
    sp 1 version 1
    sp 2 version 1
    sp 3 version 3
    view 1 version 1
    view version 1
    
    Big script (version 2) has
    sp 1 version 1
    sp 2 version 2
    sp 3 version 3
    view 1 version 1
    view 2 version 1
    

    欢迎任何反馈。

4 个答案:

答案 0 :(得分:3)

我们这样做的方法是为表,存储过程,视图等提供单独的文件,并将它们存储在自己的目录中。为了执行,我们只有一个执行所有文件的脚本。它比一个巨大的文件更容易阅读。

例如,要更新每个表格,我们使用此模板:

if not exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[MyTable]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
begin

    CREATE TABLE [dbo].[MyTable](
        [ID] [int] NOT NULL ,
        [Name] [varchar](255) NULL 
    ) ON [PRIMARY]

end else begin

    -- MyTable.Name
    IF (SELECT COL_LENGTH('MyTable','Name')) IS NULL BEGIN
        ALTER TABLE MyTable ADD [Name] [varchar](255) NULL 
        PRINT 'MyTable.Name CREATED.'
    END

    --etc

end

答案 1 :(得分:3)

您是否看过Visual Studio Team System Database Edition(现已进入开发版)?

它将做的一件事是允许维护SQL来构建整个数据库,然后仅应用更改以将目标更新为新状态。我相信,在给定参考数据库的情况下,它还会创建一个脚本,使数据库与参考模式匹配到当前模型(例如,在没有开发人员访问生产的情况下部署到生产中)。

答案 2 :(得分:1)

当我必须处理一些SQL表,过程和触发器时,我执行了以下操作:

  • 版本控制下的所有文件(当时的CVS,但请查看SVN或Bazaar)
  • 每个对象以对象命名的一个文件
  • 一个说明文件之间依赖关系的makefile

这是一个oracle项目,每次你改变一个表,你都必须重新触发它。 我的触发器使用了几个模块,所以当它们的相关模块更新时也必须重新编译......

makefile避免使用“大文件”方法:您不必为每次更改都执行所有代码。

在Windows下,您可以下载“NMAKE.exe”以使用makefile

HTH

答案 3 :(得分:-1)

请参阅我对类似问题的回答,这可能有所帮助:

Database schema updates

其他一些要点:

当我们发布版本时,例如对于版本2,我们将所有Sprocs连接在一起,其修改日期比之前版本更新。

我们小心地在每个Sproc脚本的底部添加至少一个空行,并用注释启动每个Sproc脚本 - 否则连接可以产生“GOCREATE NextSproc” - 这是一个膛!

当我们运行连接脚本时,我们有时会发现我们遇到了冲突 - 例如调用尚不存在的子Sprocs。我们在脚本底部复制了此类Sprocs的代码 - 因此它们会再次重新创建 - 以确保SQL Server的依赖关系表是正确的。 (即我们在发布的QA阶段对此进行排序)

另外,我们在每个Sproc脚本的底部放置了一个GRANT权限声明,这样当我们删除/创建一个SProc时,我们会重新授予权限。但是,如果您的权限分配给每个用户,或者在每个服务器上分配不同,那么使用ALTER而不是CREATE可能更好 - 但如果SProc尚不存在则这是一个问题,因此最好是做:

IF NOT EXIST ...
    CREATE PROCEDURE MySproc AS SELECT 'STUB'
    GRANT EXECUTE Permissions

然后Stub立即被真正的ALTER Sproc语句取代。