发布程序如果变更了数据库如何升级(提出好方案的另外加分)(300分)

  • 主题发起人 主题发起人 blue_morning
  • 开始时间 开始时间
B

blue_morning

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在准备发布一个系统(版本1.0),但同时也在改进它。
经过一段时间后,我的新系统(2.0)出来了,程序代码和数据库的结构发生了很多变化。
问题的关键是在于1.0的数据库中的用户数据如何升到2.0的数据库。
我认为可行的一种方法是:Alter来修改表。
第二种方法是建新库,把用户的数据转为符合新库的INSERT SQL语句,然后插入到新库中。删除老库。
大家还有什么好方法吗?多谢
 
看你的库是大改动还是小改动了。
 
库的改动很大,增减都有从这个角度来考虑
 
我认为还是修改表好。
如果创建了新库,如果数据少还无所谓,如果多那不是得insert半天。
再说写insert的代码肯定要多过alter的代码!
alter的代码好象都不用写的,直接在SQL查询分析器里面导出来就可以了。
 
suger
请问下:如何对比两个不同的表结构来导出Alter语句
 
可能用ALTER和DROP
CREATE TABLE等。。。关键一个表一个表把语句写完整。
 
还是建个新库再倒数据吧,倒数据的脚本可以事先写好,运行一下就可以了。
如果是改表的话我认为比较麻烦,还要每个表去比较字段,最后还是要处理数据,比较麻烦。
 
嘻嘻,我做过了,超好用。用sql语句更新结构!!
在自己的库里建一个 dbver表。里面填入对应程序的版本号(程序一定要加版本号哦)
程序每次运行时,读出自身的版本号,然后跟dbver里的值进行对照(无此表当然是1.0啦),发现大于dbver里的,就执行从dbver里的版本到自身版本号中间的更新语句。然后再更新dbver表里的版本号
程序每次变动数据库结构都要提升版本号,每次提升版本号,都要增加上一版本号到这一版本号的sql语句。永不清除:
示例:(我把版本号乘以10了,好比较嘛。old版本号就是dbver里的号。15就是最新版本1.5,每次改动数据库都加一个if then
)
procedure ExecUpdate(OldVer: Integer);
begin
if OldVer < 11 then
begin
{DataM.ExecCmd('alter table 用户表 add 是农历 varchar(1) DEFAULT 1');
DataM.ExecCmd(' drop view v_user ');
DataM.ExecCmd(' create view v_user as '
+ ' SELECT 类别表.编码 as 编码, 类别表.父级 as 父级,类别表.名称 as 类别, 用户表.姓名, 用户表.手机, 用户表.生日,用户表.是农历, 用户表.生日提醒, 用户表.加入时间, 用户表.到期时间, 用户表.备注 FROM 用户表 INNER JOIN 类别表 ON 用户表.类别 = 类别表.编码');
DataM.ExecCmd('Create Table 系统信息 (数据库版本号 varchar(10))');
DataM.ExecCmd('insert into 系统信息(数据库版本号) values ('
+ QuotedStr(GetBuildInfo(ParamStr(0), False)) + ')');}
end;

if OldVer < 14 then
begin
{DataM.ExecCmd(' Create Index id_hm on 要发缓存表([号码])');
DataM.ExecCmd(' Create Index id_nr on 要发缓存表([内容])');
DataM.ExecCmd(' Create Index id_sj on 要发缓存表([定时时间])');
DataM.ExecCmd(' Create Index id_hm on 发送缓存表([号码])');
DataM.ExecCmd(' Create Index id_nr on 发送缓存表([内容])');}
end;

if OldVer < 15 then
begin

end;

end;

读出自身版本号的过程为:
function GetBuildInfo(FName: string;
IsALLVerStr: Boolean = True): string;
var
VerInfoSize: DWORD;
VerInfo: Pointer;
VerValueSize: DWORD;
VerValue: PVSFixedFileInfo;
Dummy: DWORD;
begin
Result := '';
VerInfoSize := GetFileVersionInfoSize(PChar(FName), Dummy);
GetMem(VerInfo, VerInfoSize);
if not GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo) then
exit;
VerQueryValue(VerInfo, '/', Pointer(VerValue), VerValueSize);
with VerValue^do
begin
dwProductVersionMS := dwFileVersionMS;
dwProductVersionLS := dwFileVersionLS;
if IsALLVerStr then
Result := Format('%d.%d.%d.%d'
, [dwProductVersionMS shr 16
, dwProductVersionMS and $FFFF
, dwProductVersionLS shr 16
, dwProductVersionLS and $FFFF])
else
Result := Format('%d.%d'
, [dwProductVersionMS shr 16
, dwProductVersionMS and $FFFF]);
end;

FreeMem(VerInfo, VerInfoSize);
end;
 
还是用Alter修改表好一些
 
多谢大家。我还是老老实实写个对比表生成INSERT语句的做法好了。
 
后退
顶部