问题

在工作中偶尔会遇到这样的问题: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的时候,多一个心思,考虑一下这段代码可否被重复执行,然后根据需要多加一些判断条件,即可以使程序的鲁棒性更好。

可重复执行的SQL Script的更多相关文章

  1. java之生成可重复执行的sql脚本

    在实际项目开发过程中,sql脚本需要多次执行.而一般的DML和DDL语句一般只能执行一次,再次执行执行时就会报错(操作对应已存在/不存在),所以必须将sql脚本生成可重复执行的.本文共分为4部分:1. ...

  2. 解Bug之路-中间件"SQL重复执行"

    前言 我们的分库分表中间件在线上运行了两年多,到目前为止还算稳定.在笔者将精力放在处理各种灾难性事件(例如中间件物理机宕机/数据库宕机/网络隔离等突发事件)时.竟然发现还有一些奇怪的corner ca ...

  3. 使用定时器实现JavaScript的延期执行或重复执行

    使用定时器实现JavaScript的延期执行或重复执行 window 对象提供了两个方法来实现定时器的效果,分别是window.setTimeout()和 window.setInterval.其中前 ...

  4. django 执行原始SQL

    二.知识点总结 When the model query APIs don’t go far enough, you can fall back to writing raw SQL. go far ...

  5. 常用oracle可重复执行的脚本模板

    为保证脚本的可重复执行以及丢失,涉及到数据库环境的移植等,就会使用可重复执行脚本,此处仅提供相关一些模板 说明下:该脚本需要在命令窗口执行,而不是在SQL窗口执行 创建序的脚本 /** * 作者:zk ...

  6. js定时器整理(执行一次、重复执行)

    在javascritp中,有两个关于定时器的专用函数,分别为: 1.倒计定时器:timename=setTimeout("function();",delaytime); 2.循环 ...

  7. JavaScript:避免代码的重复执行

    我喜欢到一些大型网站上去翻阅它们的原代码,期望能找到一些可以应用到自己的代码中的模式,或发现一些之前从未听说过的工具和技巧.可是,在我查看这些大型网站的源代码时,经常会发现一个问题,那就是重复的代码执 ...

  8. js定时器(执行一次、重复执行)

    代码如下: <script> //定时器 异步运行 function hello(){ alert("hello"); } //使用方法名字执行方法 var t1 = ...

  9. 【翻译自mos文章】执行utlpwdmg.sql之后报ORA-28003, ORA-20001, ORA-20002, ORA-20003, ORA-20004 错误

    执行utlpwdmg.sql之后报ORA-28003, ORA-20001, ORA-20002, ORA-20003, ORA-20004 错误. 适用于: Oracle Server - Ente ...

随机推荐

  1. [Python Study Notes]with的使用

    在 Python 2.5 中, with 关键字被加入.它将常用的 try ... except ... finally ... 模式很方便的被复用.看一个最经典的例子: with open('fil ...

  2. 【技术干货】git常用命令

    2.1 git init语法: git init在当前目录初始化git仓库,适用于尚未使用git管理的项目2.2 git clone语法: git clone <url>例如: git c ...

  3. springmvc log4j 配置

    web.xml 增加 <context-param> <param-name>log4jConfigLocation</param-name> <param- ...

  4. Android Native App自动化测试实战讲解(上)(基于python)

    1.Native App自动化测试及Appuim框架介绍 android平台提供了一个基于java语言的测试框架uiautomator,它一个测试的Java库,包含了创建UI测试的各种API和执行自动 ...

  5. angular4升级angular5问题记录之this.location.back()

    在之前的项目中,导航回上一个路由采用注入的Location服务,利用浏览器的历史堆栈,导航到上一步. 官方文档也就是这么写的 而然在升级到5.2的版本的时候,在浏览器运行的时候并没有什么问题,在项目打 ...

  6. Node.js,commonjs,require

    环境: Node应用由模块组成,采用CommonJS模块规范. node的全局对象是global,没有window这个对象. process表示当前执行的进程,挂在global之下. CommonJS ...

  7. mex (离散化+线段树)

    Time Limit: 3000 ms   Memory Limit: 256 MB Description 给你一个无限长的数组,初始的时候都为0,有3种操作: 操作1是把给定区间$[l,r]$设为 ...

  8. 依赖Aspose.Cells Excel 导出

    public static void SaveExcel() { //新建工作簿 Workbook workbook = new Workbook(); //工作簿 Worksheet sheet = ...

  9. 内置函数 -- bytes -- 字节码与字符串相互转换

    说明: 1. 返回值为一个新的不可修改字节数组,每个数字元素都必须在0 - 255范围内,是bytearray函数的具有相同的行为,差别仅仅是返回的字节数组不可修改. 2. 当3个参数都不传的时候,返 ...

  10. 高性能网络 SR-IOV机制--VF与PF的通信

    PF 驱动是一个专门管理SR-IOV设备全局功能驱动,而且还要配置相关共享资源.PF 驱动 随着Hypervisor 的不同而不同,一般需要具有比普通虚拟机更高的权限才能对其进行操作.PF驱动包含了所 ...