把你的数据库置于版本控制之下
作者:MichaelPeng 来源:cnblogs.com 发布时间:2009-04-25 10:01:00
做程序开发的人都知道版本控制的重要性, 代码的管理好说,TFS/SVN/VSS/CVS,哪个都能用。但涉及到数据库的版本控制,就不是太好做的。有的team是定期把数据库的备份放到服务器上,但一来数据库备份太大,而来二进制的备份文件没有简单的diff工具来比较变化。一个比较好的实践是把数据库的架构用脚本来表示。相关的讨论可以Google之,前面几篇文章,如 Coding Horror: Is Your Database Under Version Control?, 。遗憾的是中文没能Google出什么有意义的文章。
理论有了,下面就是实践的问题。怎么生成和管理脚本。SQLServer2005右键点击数据库,[任务]->[脚本生成]能生成一堆脚本,但我还不知道有谁能够在不修改原始输出的情况下一次性运行成功这些脚本。搜了一把,生成SQLServer数据库脚本四法里介绍了一个scptxfr.exe,遗憾的是我没能在SQLServer2005里找到这个工具。倒是在SQLServer Hosting Toolkit里找到了一个Data Publishing Wizard能生成可用的数据库创建脚本,这个工具支持GUI和命令行,用起来很是方便。遗憾的是生成的脚本里只包含schema和下一级表、视图、存储过程等对象的名称,而不包含数据库名,害得我一运行,master数据库里多了一堆表。为了解决这个问题,我用python写了个脚本来生成创建数据库和using数据库的语句,再用了一个命令行封装一下。
CreatNewdb.cmd:
以下为引用的内容:
sqlpubwiz script -schemaonly -d %1 -f %1.sql.tmp echo "publish done"
if exist %1.sql del %1.sql
echo "adding database creating statements"
python createNewDB.py %*
del %1.sql.tmp
CreateNewDB.py
以下为引用的内容:
import sys
fmt = """
USE [master]
GO
/****** object: Database [%s] ******/
IF EXISTS (SELECT name FROM sys.databases WHERE name = N'%s')
DROP DATABASE [%s]
GO
CREATE DATABASE [%s]
GO
USE [%s]
"""
if len(sys.argv) != 2:
print("createNewDB <database name>")
sys.exit()
databaseName = sys.argv[1]
inFile = open(databaseName + ".sql.tmp", encoding="utf-16")
content = inFile.read()
inFile.close()
outFile = open(databaseName + ".sql", "w", encoding="utf-8")
outFile.write(fmt % (databaseName, databaseName, databaseName, databaseName, databaseName))
outFile.write(content)
现在基本解决了数据库创建脚本的问题。但后续的修改如何跟踪?
一是维护一个大的创建脚本。好处是只需要维护一个脚本,执行起来也比较方便。但跟踪变化不是一件很容易的事情。
二是维持数据库创建脚本的相对稳定,要修改一个数据库对象时就为该对象创建一个脚本。好处是容易跟踪变化,但脚本执行的顺序不易维护,还需要再写一个批处理命令来按一定书序调用这些sql脚本。
都是一些想法,还有待实践检验。
猜你喜欢
- MySQL Group By用法我们现在回到函数上。记得我们用 SUM 这个指令来算出所有的 Sales (营业额)吧!如果我们的需求变成是
- 在正文前,先简短介绍自己。我任职于广州的某个网站服务公司的系统开发员,主要任务是以.Net编写各种web系统,例如CMS.EIP。大家都知道
- AXObject可用来解决IE需要激活 ActiveX 控件和生成控件调用代码 AXObjec
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&
- 一、什么是sql子查询? 子查询是一个嵌套在Select 、Insert 、Update 或Dele
- 使用SQL SERVER的[导入]功能,便可将access数据转换,但要注意原来的'自增字段'需要修改,将相应字段标识修改为
- 国外纷纷传言IE8将是Internet Explorer的最后一个版本,这个猜测来源于Microsoft的CEO Steve
- 迭代器模式迭代器模式(Iterator Pattern)是一种常用的设计模式,用于遍历集合中的元素,不暴露集合的内部结构。迭代器模式将集合和
- 代码如下:登陆时记录cookies页面代码 <!--#include file="md5.asp"--&
- 对数据库的备份是网站管理人员的必修课,那么常用的数据库备份方式有哪些呢?应如何选择?数据库备份有四种类型,分别应用于不同的场合,下面简要介绍
- 在Internet上我们每天都会遇到数不清的表单,也看到其中大部分并没有限制用户多次提交同一个表单。缺乏这种限制有时候会产生某些预料不到的结
- 如何在本地机器上创建缓存?用法到是很简单,只需先创建Stream对象的实例,然后开始写入数据即可: Dim str&n
- 代码如下:<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001&quo
- 1.视图的概述 视图其实就是一条查询sql语句,用于显示一个或多个表或其他视图中的相关数据。视图将一个查询的结果作为一个表来使用,因此视图可
- flash_url : "../swfupload/swfupload_f8.swf" upload_url: &quo
- 本XML系列教程将分三部分发布,到最后一期我们将拥有一个功能全面,更加友好的XML菜单。本教程这个第一期涉及到了一些XML的基础知识。大家都
- 代码如下:DECLARE @T varchar(255), @C varchar(255) DECLARE Table_Cursor CUR
- html5带给我们的不仅仅是更多语义丰富的标签,还有更多更牛逼的特性,比如“离线存储”。 对于台式电脑来说,或者它并没有带来什么惊喜,但是对
- 有时候,规划师(或需求、交互)把内容呈现的框架草图搭建好后,就直接“丢”给了设计师,让设计师在画好的框架里去美化内容,出来后的效果,往往达不
- 在 ASP 的内建对象中除了用于发送、接收和处理数据的对象外,还有一些非常实用的代表 Active Server 应用程序和单个