需求:通过对sql提交到svn库的规范来实现数据库的自动部署。
用于指明数据库变更的sql脚本--约定规则
① 数据库变更的脚本应尽量保证原子性;也就是一个脚本中应尽量仅包含一条不可拆分的DDL(CREATE,ALTER etc)命令(避免出错时处理比较复杂,需要回滚之前很多步骤);当然对于DML语言(UPDATE,INSERT etc)可多包含多条,因为它们都是以事务的方式运行。
② 必须保证每次对数据库的修改都保存为sql脚本;
③ sql脚本的命名规范,必须是以数字开头以指明此sql脚本在所有脚本中的执行顺序;如001_create_table.sql,002_insert_data.sql,003_insert_data.sql;
注意:sql脚本的命名要尽量能表达此脚本执行内容的含义,例如:
004_add_index_on_custId_column_of_table_cust_index.sql.
④ 可以在sql脚本中加入回滚部分,出错时自动执行回滚语句;
如001_create_table.sql
CREATE TABLE FOO (
FOO_ID INTEGER NOT NULL
,FOO_VALUE VARCHAR(30)
);
ALTER TABLE FOO ADD CONSTRAINT PK_FOO PRIMARY KEY (FOO_ID);
--//@UNDOUND
DROP TABLE FOO;
⑤ 在CI中,应将数据库脚本也作为源码看待,同样做版本控制;遵循test before checkin的规则;
⑥ 假如发现提交的脚本没有起作用或者出现bug,不要试图修改原脚本,而应该重新写新脚本fix。
⑦ 不要将事务处理放到变更脚本中;
脚本:
前提需要配置好本地的
tnsnames.ora示例如下:
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =192.168.208.120)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
test.sh脚本如下:
ls -l *.sql|awk -F ' ' '{print $9}'|while read line
do
#Oracle Connection
sqlplus -sapp_pas/app_pas@10.1.94.85/PASDEVdb0<<EOF
@$line
EOF
done
参考:
sqlplus -s 用户名/密码@ip:端口/数据库实例<<EOF
遍历该文件夹下文件,并根据文件名中的时间进行排序方法一:ls -l *.sql|awk -F ' ' '{print $9}'
方法二:ls *.sql| awk -F_ '{x[$1]=$0;a[NR]=$1}END{l=asort(a,b);for(i=1;i<=l;i++){print x[b[i]]}}'