数据库升级工具

数据库升级方案sql

点击查看视频介绍数据库

 

1、面临的问题数据结构

在项目中数据库升级是常常遇到的事情,这个工做比较繁琐,特别是在线数据库升级须要十分当心,咱们先来看一下一般面临的问题:函数

一、    表修改,包括增长了字段、修改了字段类型或者长度,更换了主键等。对于表的升级不能删除重建,须要单独修改,或者写脚原本升级。工具

二、    视图的修改,视图的修改比较简单,无非是增长了字段,取消了字段,不影响基础数据。视图的升级能够删除重建。spa

三、    存储过程的修改,存储过程的修改和视图同样,能够删除重建,两者均可以经过脚原本完成。code

四、    函数的修改,若是项目中用到了函数,函数的升级和存储过程同样,再也不赘述。orm

五、    上述状况基本能涵盖了大部分的数据库升级的情景,这些工做能够在数据库管理工具中完成,也可编写脚原本完成。我想说的问题并非这个,而是有时候咱们不知道那个表,那个字段修改了,除非你每改一个地方都作好记录,尽管如此,在升级的时候也不免落下。视频

咱们公司有一套Web开发平台、由此平台开发了一套进销存,一套oa系统,而进销存又延伸出两套行业版进销存:鞋服通医药通,以上产品有兴趣的能够去官网www.hfbpm.com试用,产品线以下图:对象

 

数据库和基础功能都是继承的,即进销存使用开发平台中的表,医药通和鞋服通使用通用进销存中的表,oa使用开发平台中的表,那么它们之间的数据库升级就很是频繁,刚开靠手工记录改动的地方,针对性的升级,后来发现工做量很是大,并且常常出错。

有没有一个一劳永逸的办法,比较差别进行数据库升级?只要思想不滑坡办法总比困难多!

办法确定是有的。

2、解决方案

要解决数据库升级,主要是解决针对表、视图、存储过程函数的升级,后面三个相对来讲比较简单,直接删除重建便可,难点是如何获取三者的建立脚本?只要获取到完整的脚本,当作sql语句执行便可,mssqlServer也给出了方法(下面会具体介绍)。表的升级相对来讲要麻烦一些,由于表不能删除重建,必须对列、主键、约束等逐项进行比较升级,对于新建的表没有提供获取建立表脚本的方法,须要本身来处理。

下面详细介绍升级过程。

一、  表建立

MsSqlServer没有提供获取建立表脚本的方法,须要本身根据列属性生成建立脚本,为此咱们编写了一个存储过程Sys_TableScript_MSSQL来作这件事情,存储过程的代码以下图:

 

因为篇幅限制,详细代码就不贴出来了,这个方法也是从博客园里收到的,稍微改动了一下,执行后输出的结果以下:

 

获取的是一个完整的建立表的脚本,该脚本当作普通的sql语句执行便可。

二、表升级

当表已经存在时,针对列进行升级,若是列不存在直接建立,若是列存在,那么是否升级判断依据是长度、类型、小数点位数、容许为空、默认值是否发生改变,上述只要有其一发生变化就要升级。

建立列的sql脚本,以下:

ALTER TABLE 表名 ADD 列名  类型  not null default '默认值'

例如

ALTER TABLE dx_ZhiBan ADD  leaderName  varchar(50)  not null default '未填'

若是列已经存在须要使用修改列的sql脚本,以下:

ALTER TABLE 表名 alter column 列名 类型 not null

例如

alter table dx_ZhiBan alter column Leader nvarchar(50) not null

修改列时若是修改默认值,修改列的脚本不支持直接修改默认值,由于列一旦建立了默认值,那么就建立了一个约束,须要先删除这个约束,再从新建立默认值。删除默认值约束须要先找到默认值约束的名字,再执行删除约束脚本。查找默认值约束的sql脚本以下:

select c.name from sysconstraints a

inner join syscolumns b on a.colid=b.colid

inner join sysobjects c on a.constid=c.id

where a.id=object_id('表名') and b.name='列名'

找到约束的名字以下图:

 

删除默认值约束的sql脚本以下图:

alter table 表名 drop constraint 默认值约束名

例如:

alter table dx_ZhiBan drop constraint DF__dx_ZhiBan__Leade__3FE65219

删除默认值后,再执行建立默认值的sql脚本,以下:

alter table 表名 add default '默认值' for 列名 with values

例如:

alter table dx_ZhiBan add default '未填' for Leader with values

表的升级除了列还包括主键,主键的升级和默认值相似(由于他们都属于约束),须要先删除原来,再建立新的。查找主键约束的sql脚本以下:

  Select name from sysobjects where Parent_Obj=OBJECT_ID('表名') and xtype='PK'

例如:

 Select name from sysobjects where Parent_Obj=OBJECT_ID('dx_ZhiBan') and xtype='PK'

查找结果以下:

 

删除主键约束的sql脚本以下:

Alter table dx_ZhiBan Drop PK_dx_ZhiBan

建立主键的sql脚本以下:

ALTER TABLE dx_ZhiBan ADD PRIMARY KEY (ID, leader )

注意,联合主键用逗号分隔,另外,须要说明的是在升级以前要判断主键是否须要升级,若是主键没有变化就不须要升级。

三、视图升级

视图升级过程较简单,删除掉从新建立便可。删除视图的sql脚本以下:

drop view 视图名

获取视图建立脚本的sql脚本,以下:

EXEC sp_helptext @objname='视图名称'

执行后结果以下图:

 

获取到该脚本后,当作普通的sql语句执行便可。

四、存储过程、函数升级

两者的升级和视图相似,再也不赘述,不一样的是删除存储过程的sql脚本是:

drop procedure 存储过程名

删除函数的sql脚本是:

drop function 函数名

五、数据库升级工具

数据库的升级是都能经过sql脚原本完成的,把这些脚本管理起来须要借助程序来完成,咱们使用net的WinForm来编写程序。以下图:

 

使用这个工具能够选择那些对象须要升级(没有勾选的不升级),升级的时候能看到进度和升级结果。

本方案并非十全十美的,有些问题还没解决,例如列名称修改、如何删除多余的列等。其余不当之处欢迎你们留言指正。

点击查看视频介绍

相关文章
相关标签/搜索