博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
可重复执行的SQL Script
阅读量:6891 次
发布时间:2019-06-27

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

问题

在工作中偶尔会遇到这样的问题:SQL script重复执行时会报错。

理想的状态下,SQL script跑一遍就够了,是不会重复执行的,但是实际情况往往很复杂。

比如Dev同学在开发时在A环境把他写的那个脚本单独执行了一遍,而在下一个测试周期的时候,测试同学又在A环境把所有DB脚本都执行了一遍,然后就报错了。

如下示例,这里错误的原因在于重复创建表。

例1

create table tableA (col1 char(10), col2 number);SQL Error: ORA-00955: name is already used by an existing object

再举一个例子,反复执行插入语句虽然可能不会报错(如果没有constraint的话),但是却造成了数据冗余,甚至会影响Data Quality。

例2

insert into tableA values ('ItemA', 10);

原因

这个问题有两个方面的原因:

  • 执行DB脚本的人在不同的的开发周期中往往不是同一个人,且缺乏各个脚本在不同环境的执行记录。
  • DB脚本本身不可(适合)重复执行。

解决方案

解决的方案也有两个方面:

一是,规定Dev一般只在开发环境做测试,如果在其他环境跑了脚本要及时Roll Back。另外,创建一张表,用来记录各个DB脚本在不同环境的执行记录:时间戳,执行人员,成功或失败。

二是,写可重复执行的DB Script。比如上面的两个例子可以改成:

例子1-1

declare     isexists number;begin    select count(*) into isexists from all_tables where table_name='tableA' and owner = 'sysA';    if isexists = 1 then        execute immediate 'drop table "sysA"."tableA" purge';    end if;    execute immediate 'create table tableA (col1 char(10), col2 number)';end;

例子2-1

declare     countNum number;begin    select count(*) into countNum from tableA where col1 = 'ItemA';    if countNum > 0 then        delete from tableA where col1 = 'ItemA';    insert into tableA values ('ItemA', 20);    end if;commit;end;

总的来说,在写DDL或者DML的时候,多一个心思,考虑一下这段代码可否被重复执行,然后根据需要多加一些判断条件,即可以使程序的鲁棒性更好。

转载于:https://www.cnblogs.com/maxstack/p/8524528.html

你可能感兴趣的文章
前后端联调
查看>>
OpenCV与QT联合编译 分类: Eye_Detection ...
查看>>
LNMP架构介绍
查看>>
洛谷3986
查看>>
ssh服务
查看>>
Eclipse的基本使用
查看>>
构建之法 第五章 团队和流程
查看>>
(转)如何在eclipse的配置文件里指定jdk路径
查看>>
如何将atom侧边栏显示在右侧
查看>>
Block介绍(一)基础
查看>>
COLORREF的结构和用法
查看>>
《c程序设计语言》读书笔记--统计换行数,空格数,tab数
查看>>
【14】代理模式(Proxy Pattern)
查看>>
C# 16进制与字符串、字节数组之间的转换
查看>>
Visual Studio 2013 为C#类文件添加版权信息
查看>>
[考试]20151105
查看>>
排序一:冒泡以及三种优化
查看>>
NodeJS Stream 五:双工流
查看>>
Visual Studio 2010中配置SharpPcap
查看>>
记一次由于缺少外键索引导致的血案
查看>>