本文详细的讲述了Unix下卸载Oracle表结构到文本中的脚本。
7 T9 V, }3 `. m1 w现象:由于Oracle的EXP的结果不能转化为文本,由于没有安装metadata,所以get-ddk不能成功。
" Y% B. Y! |; G" @- t. o缺点:不能处理视图、同义名、存储过程。
, Y/ e6 r% H5 v2 d k0 l# R
涉及的系统表:
; {" S' w: \/ `2 C9 v; ^
1. User_tables 用户表。
. K8 C+ ?9 |" {9 L4 U
2. User_tab_columns 用户表的字段。
) l& `+ E4 p3 y8 Z: C" N3. User_view 用户视图。
- q0 [; `9 g& V. E" B+ Q
4. User_indexes 用户表的索引。
$ m0 c7 |4 \! `0 P# ^- H" Q5. User_ind_columns 用户表字段的索引。
& h0 U) a, Z; Z$ ^, _& {& a6 t
6. User_constraints 用户表的限定。
% L& ~: _9 r7 ?2 ~" _7. User_cons_columns 用户表字段的限定。
: y* e# |) ^" y
使用方法:dbschema.sh
, I) v! A, m1 y3 C
功能:
0 L$ m( b8 u9 e
根据一个数据库或表名来卸载结构,并在当前目录中生成对应的数据结构文件,包含表结构、主键、外键、索引等。
5 V: _, a# r# O2 l' b) w语法:
6 n1 [" c& c7 j! |! x' x
: `( |6 w7 \& c# H, @ ~9 D2 C1 V7 W* ~4 j" Q6 k! w% q
: e" B4 Z/ n2 r; e, w
5 h4 y a5 S3 X+ X: ~ F3 c" m8 K! Z" G; Q, \1 D1 k0 w
dbschema.sh userid/passwd[@connection][table_name]
( ^# q# ]" Y9 W& Tuserid/passwd[@oracle_sid]: 登录数据库的信息
% N0 v( i+ d! j- mtablename : 卸载的表名[可选]
1 f5 ?: v. o# h; t8 i* j3 g; V举例说明: 1 F" {: Y* Y/ T: G
dbschema.sh test/test@testdb:逐个处理该用户的表,在当前目录中生成test.sql脚本。
0 n5 l ^ p" h$ v& ]+ M idbschema.sh test/test@testdb TT:处理test用户的tt表,在当前目录中生成tt.sql脚本。
& s t, L: v! F脚本说明: 4 z4 Q- Y+ f4 u$ K. U$ o- Z( b
& _+ ~1 m, Q/ p
# q0 q: R. a* w) d- V9 ?' X8 F# {4 n& Y4 a* K3 X, e7 Z
2 m- g6 a7 U! i
, B: b6 i a) `1 ^: E) X) r
#!/usr/bin/ksh
4 C! j4 z8 B6 }5 |% r* [. a#################################################
) J# z( Y& ~ T0 p$ U# K9 p#
) K Z& ^/ H3 n& |" ?6 C1 d
# 模块: dbschema.sh
8 l7 Y4 Y% W. y3 O5 r7 ~#
; v7 S! |3 ]8 ]+ v: g) S) n
# 描述: 根据一个数据库或表名来获取相应的结构脚本
. H7 H- W' y0 w3 W! f: }7 ?#
% N& f) h4 v, W# 参数 1 = 用户名/密码[@实例名]
+ a$ a! ?/ P* d& U+ j
# 参数 2 = 表名/视图名(可选)
% O4 d7 X" N) e1 H9 y# c#
% w! c( ]$ L% I+ E/ ~3 D
# 作者 Bing He
& _& t3 ?: f3 O {# l2 U- f
#
Q& @8 z- b. W J$ n0 \! b# 修改记录
* h! B* B7 D& l7 O5 Q- l5 m# 日期 修改人 修改描述
b; m4 N k% d# F6 a#
0 q8 a1 i! \' g6 w( R
# 10/20/2003 Bing He 开始编写
& P8 Y3 e7 \# K* n* c/ r$ s#
. t, P+ Y4 `6 C# O7 o- b#################################################
; _0 M. E1 U) T4 N2 L+ u7 v" ?: w
#################################################
% y% ?) a" c, P& h2 S5 k0 ?6 k##-- 局部变量定义
7 S. L- L$ b) ~' ~# H
lv_argc=0 #命令行入参个数
7 |9 ^! N' U# h( a. a a( }% Mlv_loginfo="" #命令行中的登录信息
: ^; E/ n2 v# V4 glv_table_name="" #命令行中的表名信息
+ ]2 w0 l) |; z3 y& B7 C
lv_filename="" #输出的文件名
. u& F! [% X0 Rlv_tab_number=0 #需要处理的表的个数
2 a" `; V" s- Z# dlv_sep='|' #分隔符
3 F5 h! C' |5 W$ W7 l) [. X
lv_grid_str="\t" #输出的距行首的空格
! H. ^! x5 ~$ A8 F+ L6 X: ^0 D0 ^lv_deal_table="" #当前处理的表
; G# A" @. A% c, d
lv_file_temp1="get_ddl.temp1" #临时文件名
8 x! X, O1 x* w0 H& T8 W0 E
lv_file_temp2="get_ddl.temp2" #临时文件名
! L) n: r0 i8 r7 M2 z
lv_file_temp3="get_ddl.temp3" #临时文件名
+ Z! y9 N/ `' Z* H' C+ Z# Plv_file_tab_col="get_ddl.col1" #临时文件名
' w. n1 t. J7 \
lv_file_tab_con="get_ddl.con1" #临时文件名
4 g( c; X) t0 A3 A- @lv_file_col_con="get_ddl.con2" #临时文件名
$ K6 M9 S" r) Z& K& F! v
lv_file_tab_ind="get_ddl.ind1" #临时文件名
4 q6 Z9 h- V# _lv_file_col_ind="get_ddl.ind2" #临时文件名
0 @! p4 s. _; v" `* u+ ]6 r##################################################
+ ^: q; D8 n/ u7 r& v! U3 R( [1 e( n* E
##################################################
% |# D/ q2 F- _& f##-- 检查用户名密码的权限
: B8 a5 v0 ~+ r4 d1 `( R6 z
f_check_userid()
) j. E! k0 S4 A, Z6 Y: b+ [{
8 _, N; j1 H. Q- R
sqlplus ${lv_loginfo} < /dev/null
' H9 K6 @9 h( G/ z6 x
set echo off;
7 Q: P9 t) P0 g. a3 tset heading off;
% S0 Z- s) _4 x" |3 Q+ L+ kdesc user_tables;
2 X" V1 r: T; J
exit
5 y- J4 n0 B! [!
# ~6 `; W0 _- l1 {& q; Q a' f; ~if [ "$?" -ne 0 ]
9 y0 m4 d2 r3 ?5 }) R( vthen
5 A) u6 L0 i6 {- h4 f5 D: w, Gecho "Error:f_check_userid failed."
9 _, \$ i1 N0 p" L, l
echo " Please check the username/passwd=[${lv_loginfo}]."
# M! c: |" Y# J0 w7 |2 ~4 Uexit
. \# I1 m |& V; ]5 F9 j& P3 s
fi
+ d; D: M; y J4 _7 E
}
0 V! V3 |) B6 [' p! [
###################################################
0 G1 B6 x! z V4 q0 R/ R
6 ?' M/ l0 s7 f3 z8 V& f###################################################
* k& D7 S* y( m6 y/ V3 F: E) I$ x d
##-- 检查表是否存在
~- e: Y" c# @
f_check_tablename()
5 n/ l ~# V m1 d# V6 o7 h$ }{
1 F3 A. f2 J/ e5 l3 Zsqlplus ${lv_loginfo} < /dev/null
6 O* A7 ~1 z' C0 {# p& aset echo off;
( N4 U' X: }* j" ?8 B
set heading off;
- D. ?5 ]7 T; C4 H; R# p7 z0 u, jspool ${lv_file_temp1}
Y2 I& r# Q; N$ f- cselect count(*) from user_tables
9 \ G% D% B" j, ^
where table_name='${lv_table_name}';
$ k$ F3 }" t/ Ospool off
: c$ _- ~- D, |1 Wexit
3 w$ ^; h. X# x1 f!
- ~+ w5 [9 e; O; f* L0 P6 q
if [ "$?" -ne 0 ]
- Z9 k5 q4 T. J- {# S) G' H, O5 Uthen
1 R5 N4 X, }& C1 s6 l7 _% r/ {& Mecho "Error:f_check_tablename failed."
4 U6 W/ Q9 Y6 ~2 t% o( D4 F1 Techo " Please check the [${lv_table_name}]."
$ l6 u& U2 a# r: I7 k1 {3 Nexit
' c; j! b/ ]% u' [$ `, v- v- X" Q: ufi
( y, V) x1 y8 }# l
lv_number=`cat ${lv_file_temp1}|grep -v "^SQL>"
3 Z) P, h- G, [! k8 U
|grep -v "^$"|grep -v "rows selected`
, W- x. T' f3 K# {6 Q) T
if [ ${lv_number} -eq 0 ]
- T, ?0 {( l6 ?# Ithen
7 ] J9 y# C$ `/ H8 q& A h% w
echo "Error:f_check_tablenaem failed."
2 K8 O' L f0 Hecho " Please check the table [${lv_table_name}]
, ?' |; o- i! }5 ]
in [${lv_loginfo}]."
, j4 ?4 a* H/ W. j1 U4 lexit
' G" C8 M8 u: C9 J# ~% {( X2 `
fi
; V; i! N5 A6 q5 E, s) {
}
) ^, p$ B: f& v z! M
#################################################
" ~ U8 v# Q$ Z& f
! ?$ N" ?5 C( ?: K/ N5 g
#################################################
( T, r+ D! Z* {
##-- 初始化输出文件
4 b5 ?2 R6 P( f1 ]( d2 O! `. \7 Z
f_generate_file()
' o/ P) g- N- ]0 ~7 C{
6 y) r& `; Q0 X' t5 R* ^, ?! \- B' ?if [ ${lv_argc} -eq 1 ]
- l; N3 Y, q* s' | [then
' e+ l9 S4 E9 k1 t+ S6 Klv_str=`echo ${lv_loginfo}|cut -d"/" -f1|
& J) B6 _6 o5 a; v, r) F3 U6 e tr "[:upper:]" "[:lower:]"`
$ {( b9 l' _9 Llv_str_main="Structure For User ${lv_str}"
5 i V$ L8 M- M+ N+ h" L/ b N- _4 belse
) y: {$ s% n2 [6 Qlv_str=`echo ${lv_table_name}| tr "[:upper:]"
$ ~, i! E6 { U% f9 S* \6 s( H- b' H "[:lower:]"`
}7 N/ ]+ V2 {
lv_str_main="Structure For Table ${lv_str}"
' H: U( s, S, J- V& l
fi
) a% i, t% j# b$ blv_filename_drop_index="${lv_str}.drop_index"
3 v6 G+ G; m$ E3 J6 V' ~8 ]% i
lv_filename_drop_foreign="${lv_str}.drop_foreign"
" R8 d v4 ?/ K/ l# W, u- {1 Klv_filename_drop_table="${lv_str}.drop_table"
& g, x7 q6 ]+ B& k
lv_filename_create_table="${lv_str}.create_table"
" P/ S( s5 w1 `$ H: Llv_filename_create_foreign="${lv_str}.create_foreign"
& s* B6 m; y# V, L
lv_filename="${lv_str}.sql"
E: l4 J8 M5 e8 Y* ?6 Crm -f ${lv_filename_drop_index}
+ L! u- W7 R2 F$ c
rm -f ${lv_filename_drop_foreign}
6 y/ G ^7 L. I: N6 s6 k
rm -f ${lv_filename_drop_table}
) L3 L6 ?) U# Q4 y8 j/ L
rm -f ${lv_filename_create_table}
& \8 X+ P, R( y5 ~$ _1 X( K4 mrm -f ${lv_filename_create_foreign}
) @5 b2 S; }, u0 ^* u
rm -f ${lv_filename}
5 g2 f* O; O- D
: E( x" z6 b' P' i+ [- }5 S
##--生成基础数据
( P+ c( F4 V3 [. J7 Hlv_str1="---------------------------------------------------"
% @. D8 U/ d# Z1 n2 o9 m- Aecho "\n"${lv_str1} >> ${lv_filename_drop_index}
' Y/ _/ F* N7 O1 u7 [) C& f8 c: Fecho "--** 第一步: 删除索引 **--" >> ${lv_filename_drop_index}
) P3 q1 P" N) C- B* i+ O# Wecho ${lv_str1}"\n" >> ${lv_filename_drop_index}
+ ?7 B' z4 F/ a
, ?% X* O" y8 J4 Z6 e; wlv_str1="---------------------------------------------------"
/ @0 q# E1 |+ d4 ~& J# q$ V& t# Pecho "\n"${lv_str1} >> ${lv_filename_drop_foreign}
$ k0 S6 B; A2 H* H
echo "--** 第二步: 删除外键 **--" >> ${lv_filename_drop_foreign}
$ p+ h! c- K0 D" H
echo ${lv_str1}"\n" >> ${lv_filename_drop_foreign}
# u- U. X: X$ u
' t1 F6 C0 ?& {0 Klv_str1="---------------------------------------------------"
K* q% f, p- U" p. F8 `
echo "\n"${lv_str1} >> ${lv_filename_drop_table}
! Y$ v* Z0 t) A: U1 U
echo "--** 第三步: 删除表 **--" >> ${lv_filename_drop_table}
7 C0 ^% a& J1 e% T
echo ${lv_str1}"\n" >> ${lv_filename_drop_table}
- H! W- y- ]6 \. ~9 o1 W* A
; A& C: [ }3 \3 h
lv_str1="---------------------------------------------------"
j6 `' l( R7 F% } z( g) zecho "\n"${lv_str1} >> ${lv_filename_create_table}
: P5 T0 Q9 L8 }1 h. O0 v/ O
echo "--** 第四步: 创建表结构,主键,索引**--" >> ${lv_filename_create_table}
2 ?* v& t5 L' z! `echo ${lv_str1} >> ${lv_filename_create_table}
/ _. _! i3 x2 K2 p% I+ x/ }' ^
7 W1 u1 V' w3 F* {* s9 Hlv_str1="--------------------------------------------------"
! X4 e5 S( K1 Mecho "\n"${lv_str1} >> ${lv_filename_create_foreign}
' q+ F) m& D& X i2 k Necho "--** 第五步: 创建外键 **--" >> ${lv_filename_create_foreign}
9 q4 P. s. @" o- U# U# eecho ${lv_str1}"\n" >> ${lv_filename_create_foreign}
2 `3 P' M4 P+ E- {- J+ P/ X& Y' C" h
/ D/ G! w1 _( W% Y6 G5 Ylv_str1="--------------------------------------------------"
% r& f# m+ h% d R4 O
echo "\n"${lv_str1} >> ${lv_filename}
3 w' {2 c2 l; x5 L/ y6 Z% Wecho "--** DESC

{lv_str_main}" >> ${lv_filename}
# b* m! p# h! A, _; \2 becho "--** AUTHOR:Bing He" >> ${lv_filename}
& a9 k& B% D: P
echo "--** DATE :20`date %y-%m-%d" >> ${lv_filename}
, z. y2 z S! `0 f* u7 \9 yecho ${lv_str1}"\n" >> ${lv_filename}
8 R6 C7 M) o) v q5 H
7 f" l0 [# [% k}
, \$ Q2 x, D( ]' o# [3 h###########################################################
) j& b3 p* L7 k. W# A9 l$ P- ] p+ \# v ?% J) Q5 m
###########################################################
/ z4 g0 `- |. N) B2 q9 j5 j##-- 获取用户下的表列表
3 o5 s' V' U* c
f_get_tables()
2 j8 R p9 d; {2 m{
7 I" A: |: z0 N" a) G) Z% u* Brm -f ${lv_file_temp1}
* `, b# n: p2 U; Q' O: Y% Ssqlplus ${lv_loginfo} </dev/null
' O1 o- j, L8 ?5 o0 a$ G4 X) m
set colsep ${lv_sep};
! \! g$ F! z; b! d8 f7 T( yset echo off;
2 o# P7 i2 [: U; @8 N' E& ]9 H
set feedback off;
( h9 M5 V& ?4 J$ t# X! Y1 A: Pset heading off;
0 y$ _. y6 U/ L% |% g. d" |set pagesize 0;
5 S: S& p- M/ e2 N: b; Q2 h) ~2 Fset linesize 1000;
" k4 I3 `3 P/ C v& N) K3 T& F0 cset numwidth 12;
; \ i0 e3 e2 S/ P" \* [4 u. Vset termout off;
# `4 B+ C; k2 {7 Q* M/ n
set trimout on;
0 S5 s( |' p* K# P: n0 }3 K+ v6 B. Z2 Sset trimspool on;
1 D/ k9 x- ^4 {. w7 x
spool ${lv_file_temp1};
1 [ @/ M2 C7 l0 m/ p9 G
select table_name from user_tables;
; d# I, P3 `7 y0 F" Q
spool off;
& S# z+ r5 ^1 Z$ ~1 D) ~% Texit
0 z# [; n5 y3 l4 d1 J! f$ L!
7 Z& p5 `( v' k" @if [ "$?" -ne 0 ] ; then
# @! i7 R9 x5 Q! G/ A8 W3 X6 u8 becho "Usage:f_get_tables failed."
1 c7 n( z# d0 n. qexit
# ^! ] T6 o8 L7 t7 i# o3 U' {3 I
fi
1 @- f' i3 G6 b/ L/ Y6 _
' J/ x- Z+ e, i& h' r
if [ -f ${lv_file_temp1} ]
5 W8 d, v" z3 @/ ]: M- Z* hthen
0 E3 _, ]1 _! t0 a: wlv_table_name=`cat ${lv_file_temp1}
6 K, u) o4 n% {: H
|grep -v "^SQL>" | tr -d ' '| tr "[:lower:]" "[:upper:]"`
& o3 @) r9 [0 F qecho ${lv_table_name} > 1.out
+ P/ B+ A: i* X* }+ Delse
- r0 k. j! F9 O& R/ s$ m7 f6 recho "Error:f_get_tables failed.${lv_file_temp1} file not found!"
: n! y: K2 G, m+ `$ z8 M
exit
`; y3 q' n# v; R: w, q8 _5 P9 C/ y
fi
: i3 |3 G; l& O% |9 z/ i; `# k
rm -f ${lv_file_temp1}
: G" ]: M+ O: ]4 N}
' G2 ^$ A" N1 D
#################