把你的数据库置于版本控制之下

作者: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脚本。

都是一些想法,还有待实践检验。

标签:数据库,版本,控制,SQLServer
0
投稿

猜你喜欢

  • 谈一谈基于python的面向对象编程基础

    2021-09-09 11:04:39
  • python super的使用方法及实例详解

    2023-08-19 11:04:49
  • 使用Canal实现PHP应用程序与MySQL数据库的实时数据同步

    2023-05-25 01:54:39
  • react-native ListView下拉刷新上拉加载实现代码

    2023-07-02 06:35:34
  • 详解MySQL 慢查询

    2024-01-26 19:00:58
  • 为FCKeditor2.6添加行距功能(最新修改)

    2008-08-18 21:09:00
  • python使用numpy中的size()函数实例用法详解

    2023-11-19 10:18:45
  • javascript实现checkbox全选的代码

    2024-04-16 10:38:11
  • pandas 按照特定顺序输出的实现代码

    2023-02-04 19:35:17
  • ant design 日期格式化的实现

    2024-05-09 15:28:47
  • 在Python中通过threading模块定义和调用线程的方法

    2022-03-08 23:23:49
  • Python 获取主机ip与hostname的方法

    2021-05-13 09:30:30
  • Django如何创作一个简单的最小程序

    2022-09-04 04:57:28
  • 如何创建一个对索引服务器进行查询的ASP页面?

    2009-11-14 20:54:00
  • 分享JavaScript与Java中MD5使用两个例子

    2024-05-22 10:40:17
  • MySQL定期分析检查与优化表的方法小结

    2024-01-24 15:04:14
  • Python学习之路之pycharm的第一个项目搭建过程

    2022-01-14 23:16:52
  • javascript设置页面背景色及背景图片的方法

    2023-09-06 22:00:51
  • Mysql导入TXT文件

    2012-01-05 19:01:10
  • 实操Python爬取觅知网素材图片示例

    2021-12-12 21:19:59
  • asp之家 网络编程 m.aspxhome.com