【问题标题】:How to Manage SQL Source Code?如何管理 SQL 源代码?
【发布时间】:2010-10-09 01:00:24
【问题描述】:

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

我一直在使用一个大文本文件,其中包含 IF EXIST ...DELETE GO CREATE PROCEDURE... 用于配置脚本的所有 sproc、udf、视图和所有插入/更新。

随着时间的推移,添加了新的 sproc,或者更改了现有的 sproc。

我在创建这个 BIG 单个文本文件时犯的最大错误(据我所知)是在文本文件的开头使用新/更改的 sproc 的代码。但是,我忘记排除新/更改的存储过程的先前代码。让我们来说明这一点:

假设我的 BIG 脚本(版本 1)包含创建存储过程的脚本

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. 我已经浏览了最新版本的 BIG 脚本,并将所有脚本的代码放入相应的文件夹中。有些脚本在 BIG 脚本中重复多次。如果创建特定存储过程的代码块不止一个,我会将早期版本放入该存储过程的文件夹中另一个名为“old”的子文件夹中。幸运的是,我一直记录我对所有 sprocs/view 等所做的所有更改——我记下日期、版本号和所做更改的描述,作为 sproc 代码中的注释。当 sproc 有多个代码块时,这有助于我找出 sprocs 的最新版本代码。

  3. 我创建了一个 DOS 批处理来连接所有单独的脚本来创建我的 BIG 脚本。我尝试使用 .net 流读取器/写入器,它与编码和“£”符号混淆。所以我暂时还是坚持DOS批处理。

有什么方法可以改进整个过程吗? 目前,我正在以某种方式记录 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

欢迎任何反馈。

【问题讨论】:

  • 你为什么继续与大脚本斗争?拥有大脚本能创造什么价值?为什么大脚本如此重要?请用 Big Script 的一些理由更新您的问题。
  • 刚开始时,我有一个 BIG 脚本和数据库。该公司将最新的数据库提供给新客户,并将 BIG 脚本提供给现有客户以更新其旧数据库。如果有更好的方法可以帮助我摆脱这个 BIG 脚本,我一定会这样做。

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


【解决方案1】:

你看过Visual Studio Team System Database Edition(现在合并到开发者版中)了吗?

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

【讨论】:

  • 听起来不错。我的“补丁脚本”往往还包含一些数据操作 - 例如“如果这样,则将 NewColumn 设置为 A,如果那样......则设置为 B” - 不知道 VS 是否提供了执行此类操作的途径?
  • 不知道。我的需求(目前)足够简单,以至于数据库版本太过分了,所以没有时间深入了解更多细节。
  • Team System Database 的问题是您必须运行 2k5 或更高版本;我们有很多遗留的 SQL 2000 数据库。 :(
  • @Joe:我希望那里有产品,但其他工具往往会让 VSTS 看起来很便宜。
  • 我已经要求我们的 IT 人员查看 VSTS for DB prof。我想我还需要一段时间才能听到他的消息!!!
【解决方案2】:

我们这样做的方式是为表、存储过程、视图等设置单独的文件,并将它们也存储在它们自己的目录中。对于执行,我们只有一个执行所有文件的脚本。它绝对比拥有一个大文件更容易阅读。

以更新每个表为例,我们使用这个模板:

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

【讨论】:

  • 我猜你用来执行所有文件的脚本要求你在安装过程中拥有完整的文件夹结构。如果客户需要升级数据库,您是否将脚本和文件夹结构发送给他们?我们使用 if exists...from information.schema.tables/routines BTW。
  • 如何排序要执行的文件的顺序,尤其是涉及到外键约束和依赖于不同表的 SP 时?
  • @ahmjt - 对于客户端升级,我们倾向于在现场帮助他们的系统管理员(或任何人)完成整个过程。如果有任何“需要立即解决”的问题,电子邮件很好,但我们会简化我们发送给他们的内容,以便他们只得到他们需要的东西。
【解决方案3】:

当我不得不处理一些 SQL 表、过程和触发器时,我做了以下事情:

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

这是一个 oracle 项目,每次更改表时都必须重新完成其触发器。 而且我的触发器使用了几个模块,因此在更新它们的依赖模块时也必须重新编译......

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

windows下可以下载“NMAKE.exe”使用makefile

HTH

【讨论】:

    【解决方案4】:

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

    Database schema updates

    补充几点:

    当我们发布时,例如对于版本 2,我们将所有 Sproc 连接在一起,这些 Sproc 的修改日期比上一版本更新。

    我们小心翼翼地在每个 Sproc 脚本的底部添加至少一个空行,并以注释开始每个 Sproc 脚本 - 否则连接会产生“GOCREATE NextSproc” - 这很无聊!

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

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

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

    然后该 Stub 立即被真正的 ALTER Sproc 语句替换。

    【讨论】:

    • 我正在做类似的事情。例如,每个 sproc 都以空行开头,后跟一个 GO stmt。 GO -- sproc1 的开始(如果存在)(从 information.schema 中选择 1 .....) drop procedure sproc1 go create procedure sproc1 -- end of sproc 1 go
    猜你喜欢
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    相关资源
    最近更新 更多