Chinaunix首页 | 论坛 | 博客
  • 博客访问: 92268258
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-05-21 22:37:20

  来源:

本文详细的讲述了Unix下卸载Oracle表结构到文本中的脚本。

现象:由于Oracle的EXP的结果不能转化为文本,由于没有安装metadata,所以get-ddk不能成功。

缺点:不能处理视图、同义名、存储过程。

涉及的系统表:

1. User_tables 用户表。

2. User_tab_columns 用户表的字段。

3. User_view 用户视图。

4. User_indexes 用户表的索引。

5. User_ind_columns 用户表字段的索引。

6. User_constraints 用户表的限定。

7. User_cons_columns 用户表字段的限定。

使用:dbschema.sh

功能

根据一个数据库或表名来卸载结构,并在当前目录中生成对应的数据结构文件,包含表结构、主键、外键、索引等。

语法

dbschema.sh userid/passwd[@connection][table_name]
userid/passwd[@oracle_sid]: 登录数据库的
tablename : 卸载的表名[可选]

举例说明:

dbschema.sh test/test@testdb:逐个处理该用户的表,在当前目录中生成test.sql脚本。

dbschema.sh test/test@testdb TT:处理test用户的tt表,在当前目录中生成tt.sql脚本。

脚本说明:

#!/usr/bin/ksh
#################################################
#
# 模块: dbschema.sh
#
# 描述: 根据一个数据库或表名来获取相应的结构脚本
#
# 参数 1 = 用户名/[@实例名]
# 参数 2 = 表名/视图名(可选)
#
# 作者 Bing He
#
# 修改记录
# 日期 修改人 修改描述
#
# 10/20/2003 Bing He 开始编写
#
#################################################

#################################################
##-- 局部变量定义
lv_argc=0 #命令行入参个数
lv_loginfo="" #命令行中的登录信息
lv_table_name="" #命令行中的表名信息
lv_filename="" #输出的文件名
lv_tab_number=0 #需要处理的表的个数
lv_sep='|' #分隔符
lv_grid_str="t" #输出的距行首的空格
lv_deal_table="" #当前处理的表
lv_file_temp1="get_ddl.temp1" #临时文件名
lv_file_temp2="get_ddl.temp2" #临时文件名
lv_file_temp3="get_ddl.temp3" #临时文件名
lv_file_tab_col="get_ddl.col1" #临时文件名
lv_file_tab_con="get_ddl.con1" #临时文件名
lv_file_col_con="get_ddl.con2" #临时文件名
lv_file_tab_ind="get_ddl.ind1" #临时文件名
lv_file_col_ind="get_ddl.ind2" #临时文件名
##################################################

##################################################
##-- 检查用户名密码的权限
f_check_userid()
{
sqlplus  ${lv_loginfo} < /dev/null
set echo off;
set heading off;
desc user_tables;
exit
!
if [ " $?" -ne 0 ]
then
echo "Error:f_check_userid failed."
echo " Please check the username/passwd=[ ${lv_loginfo}]."
exit
fi
}
###################################################

###################################################
##-- 检查表是否存在
f_check_tablename()
{
sqlplus  ${lv_loginfo} < /dev/null
set echo off;
set heading off;
spool  ${lv_file_temp1}
select count(*) from user_tables 
where table_name=' ${lv_table_name}';
spool off
exit
!
if [ " $?" -ne 0 ]
then
echo "Error:f_check_tablename failed."
echo " Please check the [ ${lv_table_name}]."
exit
fi
lv_number=`cat  ${lv_file_temp1}|grep -v "^SQL>"
|grep -v "^ $"|grep -v "rows selected`
if [  ${lv_number} -eq 0 ]
then
echo "Error:f_check_tablenaem failed."
echo " Please check the table [ ${lv_table_name}]
 in [ ${lv_loginfo}]."
exit
fi
}
#################################################

#################################################
##-- 初始化输出文件
f_generate_file()
{
if [  ${lv_argc} -eq 1 ]
then
lv_str=`echo  ${lv_loginfo}|cut -d"/" -f1|
 tr "[:upper:]" "[:lower:]"`
lv_str_main="Structure For User  ${lv_str}"
else
lv_str=`echo  ${lv_table_name}| tr "[:upper:]"
 "[:lower:]"`
lv_str_main="Structure For Table  ${lv_str}"
fi
lv_filename_drop_index=" ${lv_str}.drop_index"
lv_filename_drop_foreign=" ${lv_str}.drop_foreign"
lv_filename_drop_table=" ${lv_str}.drop_table"
lv_filename_create_table=" ${lv_str}.create_table"
lv_filename_create_foreign=" ${lv_str}.create_foreign"
lv_filename=" ${lv_str}.sql"
rm -f  ${lv_filename_drop_index}
rm -f  ${lv_filename_drop_foreign}
rm -f  ${lv_filename_drop_table}
rm -f  ${lv_filename_create_table}
rm -f  ${lv_filename_create_foreign}
rm -f  ${lv_filename}

##--生成基础数据
lv_str1="---------------------------------------------------"
echo "n" ${lv_str1} >>  ${lv_filename_drop_index}
echo "--** 第一步: 删除索引 **--" >>  ${lv_filename_drop_index}
echo  ${lv_str1}"n" >>  ${lv_filename_drop_index}

lv_str1="---------------------------------------------------"
echo "n" ${lv_str1} >>  ${lv_filename_drop_foreign}
echo "--** 第二步: 删除外键 **--" >>  ${lv_filename_drop_foreign}
echo  ${lv_str1}"n" >>  ${lv_filename_drop_foreign}

lv_str1="---------------------------------------------------"
echo "n" ${lv_str1} >>  ${lv_filename_drop_table}
echo "--** 第三步: 删除表 **--" >>  ${lv_filename_drop_table}
echo  ${lv_str1}"n" >>  ${lv_filename_drop_table}

lv_str1="---------------------------------------------------"
echo "n" ${lv_str1} >>  ${lv_filename_create_table}
echo "--** 第四步: 创建表结构,主键,索引**--" >>  ${lv_filename_create_table}
echo  ${lv_str1} >>  ${lv_filename_create_table}

lv_str1="--------------------------------------------------"
echo "n" ${lv_str1} >>  ${lv_filename_create_foreign}
echo "--** 第五步: 创建外键 **--" >>  ${lv_filename_create_foreign}
echo  ${lv_str1}"n" >>  ${lv_filename_create_foreign}

lv_str1="--------------------------------------------------"
echo "n" ${lv_str1} >>  ${lv_filename}
echo "--** DESC : ${lv_str_main}" >>  ${lv_filename}
echo "--** AUTHOR:Bing He" >>  ${lv_filename}
echo "--** DATE :20`date +%y-%m-%d" >>  ${lv_filename}
echo  ${lv_str1}"n" >>  ${lv_filename}

}
###########################################################

###########################################################
##-- 获取用户下的表列表
f_get_tables()
{
rm -f  ${lv_file_temp1}
sqlplus  ${lv_loginfo} " | tr -d ' '| tr "[:lower:]" "[:upper:]"`
echo  ${lv_table_name} > 1.out
else
echo "Error:f_get_tables failed. ${lv_file_temp1} file not found!"
exit
fi
rm -f  ${lv_file_temp1}
}
#################
阅读(478) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~