我负责数据库。 它有大约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多个。
补救行动:
我创建了一个文件夹结构。每个sproc / view的一个子文件夹。
我从bgeinning中浏览了最新版本的BIG脚本,并将所有脚本的代码放入相应的文件夹中。某些脚本在BIG脚本中重复多次。如果有超过用于创建特定sproc的代码块,我将早期版本放入该sproc的文件夹中名为“old”的另一个子文件夹中。幸运的是,我总是记录了我对所有sprocs / view等所做的所有更改 - 我写下了日期,版本号以及在sproc的代码中作为注释所做的更改的描述。当sprocs有多个代码块时,这对我来说很有帮助,可以找出最新版本的代码。
我创建了一个DOS批处理过程来连接所有单个脚本以创建我的BIG脚本。我尝试过使用.net streamreader / writer,它与编码和“£”符号混淆。所以我暂时坚持使用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
欢迎任何反馈。
答案 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表,过程和触发器时,我执行了以下操作:
这是一个oracle项目,每次你改变一个表,你都必须重新触发它。 我的触发器使用了几个模块,所以当它们的相关模块更新时也必须重新编译......
makefile避免使用“大文件”方法:您不必为每次更改都执行所有代码。
在Windows下,您可以下载“NMAKE.exe”以使用makefile
HTH
答案 3 :(得分:-1)
请参阅我对类似问题的回答,这可能有所帮助:
其他一些要点:
当我们发布版本时,例如对于版本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语句取代。