计算机三级:把你的数据库置于版本控制之下计算机等级考试

文章作者 100test 发表时间 2009:05:02 14:53:47
来源 100Test.Com百考试题网


  做程序开发的人都知道版本控制的重要性, 代码的管理好说,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脚本。
  都是一些想法,还有待实践检验。

  2009年上半年全国计算机等级考试参考答案请进入计算机考试论坛

  2009年全国计算机等级考试报名信息汇总

  2009年NCRE考试有新变化

  2009年全国计算机等级考试-大纲

  2009年上半年全国计算机二级考试试题及答案

  2009年上半年全国计算机等级考试试题答案汇总



相关文章


SQLServer2005如何起用xp_cmdshell计算机等级考试
计算机三级数据库:SQLServer一些实用操作计算机等级考试
数据库:左连接、右连接和内连接计算机等级考试
解决PowerDesigner里允许字段重名约束问题计算机等级考试
计算机三级:把你的数据库置于版本控制之下计算机等级考试
计算机三级:数据库系统的维护与优化计算机等级考试
SQL教程(8):SELECT语句中的自连接计算机等级考试
SQL教程(7):左连接、右连接和全连接计算机等级考试
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛