数据库升级脚本制作

最近由于公司走了一个负责数据库方面的人,一些有关数据库的任务没人做了,leader就找到了我。这次的任务是负责新版本的数据库升级脚本,难点是我对数据表结构不是很熟悉,而且新版本的功能也不是有我来负责的,还有就是数据表结构变化比较大,要保证用户原本数据不能丢失。200多张表里面还是有数据的,如果人工做的话不死人才怪。于是查找工具,先从自己熟悉的powerdesigner开始,先用反向工程分别生成新老两个数据库的模型,然后点击 菜单中database->modify database,再按照步骤做,没啥难度。完工后生成了一个很长很长的sql, 由于是机器生成,看起来超麻烦,所以一狠心,直接拿了备份升级下试试看。执行好后,报出一堆错,看看表是改了,但数据都丢失了,也不确定是不是所以的表都升级了。唉,这对于表变化比较大或原有数据比较多的情况根本行不通。

注意图中的 Use alter statements when possible选项,说的太模棱两可。我试了下,大多数只要表变化一复杂,他就开始偷懒不用alter来搞表,直接create然后把原表的数据导入。先不说效率,万一丢失了数据可不好。

如果你的表和数据都变化比较少,那PD也算个好方法,毕竟方便,高效。如果不是,下面介绍个好工具SQL Delta,这个用来对比数据库的确好用。

进入系统,设置好要升级后的数据库和升级前的数据库,然后点compare databases来比较表结构

大家可以发现字段变化看的很清楚,有多的有少的,也有改变类型的。一般建议升级时多余的字段不要删除,只增加和修改。

大家可以在右边看到工具建议的升级脚本,由于是一个表一个表查看,这样虽然工作量大了,但比较放心,而且脚本可读性较好。

这里也要注意对于表变化比较大的情况,这工具还是采用以下方法(先建立临时表,导入原表数据,然后删除原表,临时表更名成原表的名字)

IF @@TRANCOUNT = 1 CREATE TABLE [dbo].[tmp_TICKET] ( [TICKET_ID] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [TICKET_NUM] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [TICKET_SUBJECT] [varchar] (200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [TICKET_DESC] [varchar] (2500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [PRIORITY] [char] (3) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [SEVERITY] [char] (3) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [STATUS_ID] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [CHANNEL_ID] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [MACHINE_ID] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [REQUESTER_CONTACT_ID] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [OWNER_ID] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [ASSIGNEE_ID] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [ESCALATED_TO] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [ITEM_ID] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [RESOLUTION_ID] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [FOLLOWUP_FLAG] [char] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [REPORT_TIME] [datetime] NOT NULL, [CREATE_TIME] [datetime] NOT NULL, [DISPATCH_TIME] [datetime] NULL, [ASSIGN_TIME] [datetime] NULL, [CONFIRM_TIME] [datetime] NULL, [RESPONSE_TIME] [datetime] NULL, [START_WORKING_TIME] [datetime] NULL, [SLA_RESP_EXPECTED] [datetime] NULL, [SLA_RESP_HOURS] [decimal] (4, 0) NULL, [RESPONSE_TIME_EXPECTED] [datetime] NULL, [RESP_TIME_ACTUAL_VAL] [decimal] (10, 4) NULL, [RESP_TIMELINE_TYPE] [char] (3) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [CHRONIC_ACTION] [char] (3) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [RECOVER_TIME] [datetime] NULL, [FIXED_TIME] [datetime] NULL, [SLA_FIXED_EXPECTED] [datetime] NULL, [FIXED_TIME_EXPECTED] [datetime] NULL, [FIXED_TIME_ACTUAL_VAL] [decimal] (10, 4) NULL, [FIXED_TIMELINE_TYPE] [char] (3) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [SUSPEND_TIME] [datetime] NULL, [CLOSED_TIME] [datetime] NULL, [CONTRACT_FLAG] [char] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [PARENT_ID] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [PARENT_FLAG] [char] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [GROUP_ID] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [OWNER_GROUP_ID] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [PREVIOUS_GROUP_ID] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [SP_ID] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [CUSTOMER_ID] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [CLOSED_BY] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [ASSIGNMENT_FLAG] [char] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [IS_AUTO_CREATED] [char] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [IS_AUTO_FIXED] [char] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [AUTO_FIX_ENABLE] [char] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL CONSTRAINT [DF__TICKET__AUTO_FIX__0F624AF8] DEFAULT ('1'), [AUTO_RESPONSE_ENABLE] [char] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL CONSTRAINT [DF__TICKET__AUTO_RES__10566F31] DEFAULT ('1'), [REOPEN_TIMES] [int] NULL, [RESPONSE_TIME_MANUAL] [datetime] NULL, [FIXED_TIME_MANUAL] [datetime] NULL, [HISTORY_ID] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [LAST_UPDATED] [datetime] NOT NULL, [FIX_EXCLUDE_TIME_VAL] [decimal] (10, 4) NULL, [TICKET_DOMNTIME] [decimal] (10, 4) NULL, [EXTENAL_REFERENCE_NO] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ) GO IF @@ERROR <> 0 IF @@TRANCOUNT = 1 ROLLBACK TRANSACTION GO IF @@TRANCOUNT = 1 INSERT INTO [dbo].[tmp_TICKET] ([TICKET_ID], [TICKET_NUM], [TICKET_SUBJECT], [TICKET_DESC], [PRIORITY], [SEVERITY], [STATUS_ID], [CHANNEL_ID], [MACHINE_ID], [REQUESTER_CONTACT_ID], [OWNER_ID], [ASSIGNEE_ID], [ESCALATED_TO], [ITEM_ID], [RESOLUTION_ID], [FOLLOWUP_FLAG], [REPORT_TIME], [CREATE_TIME], [DISPATCH_TIME], [ASSIGN_TIME], [CONFIRM_TIME], [RESPONSE_TIME], [START_WORKING_TIME], [SLA_RESP_EXPECTED], [SLA_RESP_HOURS], [RESPONSE_TIME_EXPECTED], [RESP_TIME_ACTUAL_VAL], [RESP_TIMELINE_TYPE], [CHRONIC_ACTION], [RECOVER_TIME], [FIXED_TIME], [SLA_FIXED_EXPECTED], [FIXED_TIME_EXPECTED], [FIXED_TIME_ACTUAL_VAL], [FIXED_TIMELINE_TYPE], [SUSPEND_TIME], [CLOSED_TIME], [CONTRACT_FLAG], [PARENT_ID], [PARENT_FLAG], [GROUP_ID], [OWNER_GROUP_ID], [PREVIOUS_GROUP_ID], [SP_ID], [CUSTOMER_ID], [CLOSED_BY], [ASSIGNMENT_FLAG], [IS_AUTO_CREATED], [IS_AUTO_FIXED], [AUTO_FIX_ENABLE], [REOPEN_TIMES], [RESPONSE_TIME_MANUAL], [FIXED_TIME_MANUAL], [HISTORY_ID], [LAST_UPDATED], [FIX_EXCLUDE_TIME_VAL], [TICKET_DOMNTIME], [EXTENAL_REFERENCE_NO]) SELECT [TICKET_ID], [TICKET_NUM], [TICKET_SUBJECT], [TICKET_DESC], [PRIORITY], [SEVERITY], [STATUS_ID], [CHANNEL_ID], [MACHINE_ID], [REQUESTER_CONTACT_ID], [OWNER_ID], [ASSIGNEE_ID], [ESCALATED_TO], [ITEM_ID], [RESOLUTION_ID], [FOLLOWUP_FLAG], [REPORT_TIME], [CREATE_TIME], [DISPATCH_TIME], [ASSIGN_TIME], [CONFIRM_TIME], [RESPONSE_TIME], [START_WORKING_TIME], [SLA_RESP_EXPECTED], [SLA_RESP_HOURS], [RESPONSE_TIME_EXPECTED], [RESP_TIME_ACTUAL_VAL], [RESP_TIMELINE_TYPE], NULL, [RECOVER_TIME], [FIXED_TIME], [SLA_FIXED_EXPECTED], [FIXED_TIME_EXPECTED], [FIXED_TIME_ACTUAL_VAL], [FIXED_TIMELINE_TYPE], [SUSPEND_TIME], [CLOSED_TIME], [CONTRACT_FLAG], [PARENT_ID], [PARENT_FLAG], [GROUP_ID], [OWNER_GROUP_ID], [PREVIOUS_GROUP_ID], [SP_ID], [CUSTOMER_ID], [CLOSED_BY], [ASSIGNMENT_FLAG], [IS_AUTO_CREATED], [IS_AUTO_FIXED], [AUTO_FIX_ENABLE], NULL, [RESPONSE_TIME_MANUAL], [FIXED_TIME_MANUAL], [HISTORY_ID], [LAST_UPDATED], NULL, NULL, NULL FROM [dbo].[TICKET] GO IF @@ERROR <> 0 IF @@TRANCOUNT = 1 ROLLBACK TRANSACTION GO IF @@TRANCOUNT = 1 DROP TABLE [dbo].[TICKET] GO sp_rename N'[dbo].[tmp_TICKET]', N'TICKET'

接下来比较表内的数据,按菜单栏中的data 然后点击wizard

选中所要比较数据的表,一般是些配置用表,用户的数据不要丢失就行。

大家可以观察A,B来知道数据的变化,想在升级脚本中体现的话,就选中不想生效的就去掉勾。最后点击Sync进入后save一把,脚本就生成出来了。这个数据库升级的DDL和DML都有了,主要生成好还是要多测试下,毕竟升级有风险,升级前请做好充足的备份。

转载于:https://www.cnblogs.com/hainange/archive/2010/09/09/6153005.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、简介 1.1前言 1、由于最近工作一直用Oracle,故对Oracle数据库研究为对象。 2、根据工作业务需求实际情况进行功能研发。为什么要开发呢?因为在数据库升级或者迁移的时候,为了保证不同环境不同数据库数据保持同步,故数据库SQL脚本非常作用。比如:数据库脚本,副脚本,增量脚本。 3、 什么是主脚本、副脚本、增量脚本呢? 3.1、主脚本数据库表或存储过程,视图脚本,序列等脚本。 3.2、副脚本指必须执行主脚本之后才执行的脚本。换句话说在没执行主键脚本的情况下,副脚本执行之后会回滚事务失败。 3.3、增量脚本指在执行主脚本或副脚本之后,根据需求对某个表添加/修改约束(主外键约束,长度约束等),添加/修改字段/添加数据等情况对数据库结构改变处理的一种行为脚本。 1.2作用 1、 快速产出自定义规则需要的SQL脚本。 2、减少人工编SQL脚本出错率问题,完全通过程序检测SQL准确性。 3、帮助开发人员提高SQL编效率,减少人工编SQL开发成本问题。 4、帮助开发人员节约时间,同时避免繁琐不必要编SQL的工作。 二、实现方式与原理 2.1实现方式 1、实现方式分:正向与逆向实现。什么是正向与逆行呢【是否有鸡还是有蛋,先后道理同等】 2、正向方式:首先把设计好数据库表文档,把所有表的字段属性配置到EXCEL或者CSV格式的文件通过JXL/POI技术去读取文件的字段,再通过其他技术一系列程序处理之后生成所需要的SQL脚本。 3、逆向方式:首先有数据库表,然后通过ORM持久化技术连接数据库再读取表的字段等属性出来,再通过其他技术一系列程序处理之后生成所需要的SQL脚本。 2.2原理 对数据库软件内置核心表或视图查询出来存储用户行为表结构所有属性信息,对此属性结构信息进行分析与组装所需要SQL脚本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值