把你的数据库置于版本控制之下
理论有了,下面就是实践的问题。怎么生成和管理脚本。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脚本。
都是一些想法,还有待实践检验。