利用shell脚本生成动态sql(67天)
发布日期:2021-06-30 13:23:39 浏览次数:2 分类:技术文章

本文共 2909 字,大约阅读时间需要 9 分钟。

在一些分布式环境中,可能涉及到的数据库有很多,相关的数据库用户也不少,有些看似简单的变更可能需要在不同的库,不同的用户间要进行复杂的操作。现在我们有3套环境,一套是测试环境test,一套是准生产环境xprd,一套是生产环境prod,比如在prod上有5个库一共20个用户,某一个变更可能在这20个用户里面要进行一些的操作。xprd里面和生产环境类似,也有数据库用户,test环境中有10个用户,需要在这10个用户中进行相应的操作。最开始的时候,使用sqlplus和shell脚本,如下sqlplus -s dbuser1/dbuser1@test <<EOFxxxxxEOFexit。。。。。但是发现每次在测试环境中部署的时候,得重新修改所有的用户名密码和数据库实例,在测试环境部署了之后,在准生产环境还得重新改一次,到生产环境还是得修改,每次改动都得花费不少的时间和精力,反复验证数据库连接串是否正确。如果脚本中有使用到db link,db link的名字也可能不一样,修改的时候就可能会漏掉。每次做变更都很头疼。这一次是下定决心来做改变了,决定使用shell脚本来生成动态的sql,通过将变量嵌入到sql中达到动态的效果。下面是需要用到的环境变量,每一个后面都是一些数据库连接串。专门用一个shell脚本来保存这些变量,conn_init.shexport testwork_conn=testtestWORK/TESTtestwork@TESTCUS1export testwait_conn=testtestWAIT/TESTtestwait@TESTCUS1export testssca_conn=testtestSSCA/TESTtestssca@TESTCUS1 export testsscb_conn=testtestSSCB/TESTtestsscb@TESTCUS1 export DIS1_testssca_conn=testDIS1SSCA/TESTDIS1ssca@TESTDIS1export DIS1_testsscb_conn=testDIS1SSCB/TESTDIS1sscb@TESTDIS1export DIS2_testssca_conn=testDIS2SSCA/TESTDIS2ssca@TESTDIS2 export DIS2_testsscb_conn=testDIS2SSCB/TESTDIS2sscb@TESTDIS2 export DIS3_testssca_conn=testDIS3SSCA/TESTDIS3ssca@TESTDIS3 export DIS3_testsscb_conn=testDIS3SSCB/TESTDIS3sscb@TESTDIS3 export DIS4_testssca_conn=testDIS4SSCA/TESTDIS4ssca@TESTDIS4 export DIS4_testsscb_conn=testDIS4SSCB/TESTDIS4sscb@TESTDIS4 export CUST_DBA_conn=testdba/testdba@TESTCUS1 export DIS1_DBA_conn=testdba/testdba@TESTDIS1 export DIS2_DBA_conn=testdba/testdba@TESTDIS2export DIS3_DBA_conn=testdba/testdba@TESTDIS3export DIS4_DBA_conn=testdba/testdba@TESTDIS4export opr_conn=testOPRC/TESTOPRC@TESTCUS1 export test_mst_ins=testtestWAIT.TESTCUS1然后在所有的sql脚本中,来引用这些变量,使没个脚本在执行前对应的环境变量都生效。脚本的内容可能是下面的样子:chmod +x ./conn_init.sh. ./conn_init.shsqlplus $testwork_conn<<EOF spool TEST_TAB_CHG.log set echo on CREATE TABLE TEST_TAB_CHG( HOT_LINE_NO VARCHAR2(25) CONSTRAINT test_l_HOT_LINE_NO_NN NOT NULL, ..... FUTURE_3 VARCHAR2(30)) TABLESPACE DATAL01 LOGGING;grant UPDATE on MI9_OUTCOL_CS_HOTLINE to CCBSSOAUSR_SEL; !##testtestWAITconn $testwait_connCREATE TABLE TEST_TAB_CHG( FUTURE_3 VARCHAR2(30)) TABLESPACE DATAL01 LOGGING;grant SELECT on TEST_TAB_CHG to testtestWORK_SEL; grant SELECT,UPDATE,INSERT,DELETE on TEST_TAB_CHG to testtestWORK_ALL; !##testOPRCconn $opr_connInsert into DST_ACTIVE_SNAPSHOT (REFTABLENAME, SYS_CREATION.......commit; !##TESTDIS1conn $DIS1_testssca_connCREATE MATERIALIZED VIEW TEST_TAB_CHG REFRESH FORCE ON DEMAND WITH ROWID USING DEFAULT LOCAL ROLLBACK SEGMENT DISABLE QUERY REWRITE AS SELECT *FROM TEST_TAB_CHG @$ref_mst_ins; grant SELECT on TEST_TAB_CHG to PUBLIC; EOFexit可以从上面的脚本看到相关的连接串都会从conn_init.sh中获取,为了确保连接串的正常,可以单独创建一个通用的文件,对已经存在的表来进行测试,比如说存在的表是TEST在所有的用户中都存在。比如:test.sh sqlplus $testwork_conn <<EOFselect count(*)from TEST where rownum<2;conn $testwait_connselect count(*)from TEST where rownum<2;conn $testssca_connselect count(*)from TEST where rownum<2;conn $ testsscb_connselect count(*)from TEST where rownum<2;。。。。。

EOF

转载地址:https://jeanron100.blog.csdn.net/article/details/102506258 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:奇怪的登录问题及解决 (75天)
下一篇:关于SCN的总结测试 (68天)

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月10日 03时11分04秒