关于数据库对象版本比较的脚本
来源:互联网 发布:轻淘客创建cms方法 编辑:程序博客网 时间:2024/04/18 08:57
原创于2006年12月28日,2009年10月15日迁移至此。
项目原因导致出现两个开发环境,主数据库环境因需求变更每天都需要进行脚本的修改,而报表服务器的脚本也需要同步更新,需求变更很少会同步提醒的;人工判断太过于麻烦,我又是一个懒人;只好写个脚本自动进行识别并加以运行了。
这只是一个简单的版本比较工具,事实上变更是很难判断的,例如表中新增了一个字段,导致顺序发生变更,这个时候你很难判断是新增还是修改的;诸如字段类型的修改.因此只能去判断表是否存在,字段是否存在,进而执行判断脚本,产生相应的表脚本和字段教本。
事实上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
....
- 关于数据库对象版本比较的脚本
- 数据库脚本版本控制 和 数据库比较工具。
- 关于两个对象的比较
- 关于对象的比较方法
- 关于数据库日期的比较
- 一个命令,生成数据库对象的脚本
- 如何取得数据库对象的脚本信息
- 得到数据库中任何对象的脚本
- mysql数据库中关于时间的比较
- 一种比较健壮的脚本对象内存管理方案
- 关于javascript脚本比较常用的几个方法
- 关于PostgreSQL数据库的大对象存取
- 关于几个数据库对象的查看
- 查看一个数据库是否有INVALID的对象【脚本】
- 关于全局脚本和对象脚本
- 批量执行数据库对象脚本
- 查看数据库对象创建脚本
- oracle数据库对象导出脚本
- 检查数据库数据字段命名规范和合法性的脚本
- MAPXTREME FOR JAVA中中文显示问题
- 关于外键约束和对应主键信息的查询脚本
- windows下提升进程权限
- oper tools 教程 介绍及安装
- 关于数据库对象版本比较的脚本
- java能把我晕死
- VC++学习(1)——介绍一些重要概念
- java遍历Map中的元素
- 关于SAVEPOINT和自定义异常使用的一点看法
- wifi子系统分析
- jstl标签库的配置
- 一段实现HTML页面内定期触发事件的JavaScript代码
- 定制Apache索引样式