开发者社区> 技术小美> 正文

关于数据库对象版本比较的脚本

简介:
+关注继续查看
项目原因导致出现两个开发环境,主数据库环境因需求变更每天都需要进行脚本的修改,而报表服务器的脚本也需要同步更新,需求变更很少会同步提醒的;人工判断太过于麻烦,我又是一个懒人;只好写个脚本自动进行识别并加以运行了。
这只是一个简单的版本比较工具,事实上变更是很难判断的,例如表中新增了一个字段,导致顺序发生变更,这个时候你很难判断是新增还是修改的;诸如字段类型的修改.因此只能去判断表是否存在,字段是否存在,进而执行判断脚本,产生相应的表脚本和字段教本。
事实上Oracle有个DBMS_METADATA数据包提供了DLL脚本,不过包含了很多存储参数,对版本比较和对象生成没有什么意义。
 

--CREATE THE CREATE_TABLE SCRIPT, THOUGH WE CAN USE
--LIKE select dbms_metadata.get_ddl('TABLE','TABLENAME','USERNAME') from dual; GET THE SQL SCRIPT
--BUT IT IS NOT HELPFUL TO COMPARE THE DIFFERENT VERSION
SELECT SQLTEXT FROM 
(
SELECT 'CREATE TABLE '||TABLE_NAME AS SQLTEXT,-1 AS COLUMN_ID,TABLE_NAME FROM USER_TABLES@REMOTEKGK 
UNION
SELECT '(' AS SQLTEXT,0 AS COLUMN_ID,TABLE_NAME FROM USER_TABLES@REMOTEKGK 
UNION
SELECT ');' AS SQLTEXT,100 AS COLUMN_ID,TABLE_NAME FROM USER_TABLES@REMOTEKGK 
UNION
SELECT 
CASE WHEN DATA_TYPE='NUMBER' 
THEN
CASE WHEN DATA_PRECISION IS NULL 
THEN COLUMN_NAME||' INTEGER,'
ELSE COLUMN_NAME||' '||DATA_TYPE||'('||TO_CHAR(DATA_PRECISION)||','||TO_CHAR(DATA_SCALE)||')'||DECODE(COLUMN_ID,(SELECT MAX
(B.COLUMN_ID) FROM USER_TAB_COLUMNS@REMOTEKGK B WHERE A.TABLE_NAME=B.TABLE_NAME),' ',',')
END 
WHEN DATA_TYPE='NVARCHAR2'
THEN COLUMN_NAME||' '||DATA_TYPE||'('||TO_CHAR(DATA_LENGTH/2)||')'||DECODE(COLUMN_ID,(SELECT MAX(B.COLUMN_ID) FROM
USER_TAB_COLUMNS@REMOTEKGK B WHERE A.TABLE_NAME=B.TABLE_NAME),' ',',')
WHEN DATA_TYPE IN ('CHAR','VARCHAR2') 
THEN COLUMN_NAME||' '||DATA_TYPE||'('||TO_CHAR(DATA_LENGTH)||')'||DECODE(COLUMN_ID,(SELECT MAX(B.COLUMN_ID) FROM
USER_TAB_COLUMNS@REMOTEKGK B WHERE A.TABLE_NAME=B.TABLE_NAME),' ',',')
WHEN DATA_TYPE IN ('DATE','BLOB','CLOB','LONG','NCLOB')
THEN COLUMN_NAME||' '||DATA_TYPE||DECODE(COLUMN_ID,(SELECT MAX(B.COLUMN_ID) FROM USER_TAB_COLUMNS@REMOTEKGK B WHERE
A.TABLE_NAME=B.TABLE_NAME),' ',',')
END AS SQLTEXT,
COLUMN_ID,
A.TABLE_NAME 
FROM USER_TAB_COLUMNS@REMOTEKGK A
Where A.table_name Like 'T%'
) d
Where d.table_name Not In
(
Select c.table_name From USER_TABLES c
Where c.table_name Like 'T%'
)
ORDER BY TABLE_NAME,COLUMN_ID,SQLTEXT 
 
--ADD NEW COLUMN ACCORDING THE LATEST TABLE NAME
SELECT 'ALTER TABLE '||TABLE_NAME||' ADD "'||COLUMN_NAME||'" '||
(CASE WHEN DATA_TYPE='NUMBER' 
THEN
CASE WHEN DATA_PRECISION IS NULL 
THEN 'INTEGER'
ELSE DATA_TYPE||'('||TO_CHAR(DATA_PRECISION)||','||TO_CHAR(DATA_SCALE)||')'
END 
WHEN DATA_TYPE='NVARCHAR2'
THEN DATA_TYPE||'('||TO_CHAR(DATA_LENGTH/2)||')'
WHEN DATA_TYPE IN ('CHAR','VARCHAR2') 
THEN DATA_TYPE||'('||TO_CHAR(DATA_LENGTH)||')'
WHEN DATA_TYPE IN ('DATE','BLOB','CLOB','LONG','NCLOB')
THEN DATA_TYPE
END)||' ;' SQLTEXT
FROM USER_TAB_COLUMNS@REMOTEKGK A
Where (a.table_name,a.column_name) Not In
(
Select b.table_name,b.column_name From USER_TAB_COLS b
Where b.table_name Like 'T%'
)
And A.table_name Like 'T%'
ORDER BY COLUMN_ID 
 
--BASED THE COLUMN_NAME AND COLUMN_ID,NEED TO MODIFY THE COLUMN NAME
--BUT IN FACT MOST SITUATION IT RESULT IN NEW COLUMN,SO IT IS NO USEFUL









本文转自baoqiangwang51CTO博客,原文链接:http://blog.51cto.com/baoqiangwang/312774,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Unity 之 解决2019之后的版本打apk卡到Building Gradle project问题
解决Unity 2019版本打包APK卡到Building Gradle project问题
352 0
阿里云播放器SDK的正确打开方式 | 版本差异与三大典型应用场景(二)
阿里云播放器SDK(ApsaraVideo for Player SDK)是阿里视频云端到云到端服务的重要一环,除了支持点播和直播的基础播放功能外,还深度融合视频云业务,支持视频的加密播放、安全下载、首屏秒开、低延时等业务场景,为用户提供简单、快速、安全、稳定的视频播放服务。
5153 0
PowerDesigner生成的ORACLE 建表脚本中去掉对象的双引号,设置大、小写
原文:PowerDesigner生成的ORACLE 建表脚本中去掉对象的双引号,设置大、小写 若要将 CDM 中将 Entity的标识符都设为指定的大小写,则可以这么设定: 打开cdm的情况下,进入Tools-Model Options-Naming Convention,把Name和Code的标...
789 0
Shell脚本规范|学习笔记
快速学习Shell脚本规范
54 0
+关注
6902
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载