Unix下卸载Oracle表结构到文本中的脚本


本文详细的讲述了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}
    }
    #################

本文作者:
« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3