|
源代码网推荐
本文详细的讲述了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} </dev/null set colsep ?${lv_sep}; set echo off; set feedback off; set heading off; set pagesize 0; set linesize 1000; set numwidth 12; set termout off; set trimout on; set trimspool on; spool ?${lv_file_temp1}; select table_name from user_tables; spool off; exit ! if [ "?$?" -ne 0 ] ; then echo "Usage:f_get_tables failed." exit fi if [ -f ?${lv_file_temp1} ] then lv_table_name=`cat ?${lv_file_temp1} |grep -v "^SQL>" | 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} } #################
源代码网供稿. |