首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >有没有办法测试在SQL中修改表列是否会成功?

有没有办法测试在SQL中修改表列是否会成功?
EN

Stack Overflow用户
提问于 2015-06-03 08:17:34
回答 3查看 925关注 0票数 2

我有一个工具,可以对数据库应用很多更改。许多更改都涉及到修改列类型、大小等。是否有任何(可能是特定于Oracle的)方法预先告知给定的ALTER TABLE更改是否会成功,而不会因为值、函数索引等太长而失败?

对于非DDL修改,这很简单:启动一个事务,执行您的更改并回滚。答案可以从你是否得到一个异常中知道。但是,DDL修改不能成为事务的一部分,因此我不能在这里遵循相同的过程。

EN

回答 3

Stack Overflow用户

发布于 2015-06-03 08:42:13

是否有任何方法(可能是特定于Oracle的)提前告知给定的ALTER TABLE更改是否会成功,而不会因为值太长而失败

我要说的是,当您需要动态创建/修改数据库对象时,这不是一个好的设计。话虽如此,如果DDL失败,ORA-将与其关联。您需要重试所需的更改。修改表不是一件常规的事情,您只需创建一次表,然后只需在有业务需要时更改它,并且需要进行发布,以使应用程序不受影响。所以,我想知道在执行之前知道DDL是否成功会对您有什么帮助?如果你的工具正在做这些修改,那么你的工具应该以编程的方式处理它。在更改列之前,请检查列的类型和大小。

如果您使用外部脚本执行此操作,则需要构建您自己的逻辑。您可以使用像user_tab_columns这样的元数据视图来检查data_type、data_size、data_precision、data_scale等。

在发出SQLALTERSQL语句之前检查VARCHAR2数据类型大小的逻辑的一个小示例(出于演示目的,我用PL/执行此操作,您可以在脚本或工具中应用类似的逻辑):

代码语言:javascript
运行
AI代码解释
复制
SQL> CREATE TABLE t (A VARCHAR2(10));

Table created.

SQL> DESC t;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 A                                                  VARCHAR2(10)

SQL> SET serveroutput ON
SQL> DECLARE
  2    v_type   VARCHAR2(20);
  3    v_size   NUMBER;
  4    new_size NUMBER;
  5  BEGIN
  6    new_size:= 20;
  7    SELECT data_type,
  8      data_length
  9    INTO v_type,
 10      v_size
 11    FROM user_tab_columns
 12    WHERE table_name='T';
 13    IF v_type       ='VARCHAR2' THEN
 14      IF new_size   > v_size THEN
 15        EXECUTE IMMEDIATE 'ALTER TABLE T MODIFY A '||v_type||'('||new_size||')';
 16        DBMS_OUTPUT.PUT_LINE('Table altered successfully');
 17      ELSE
 18        DBMS_OUTPUT.PUT_LINE('New size should be greater than existing data size');
 19      END IF;
 20    END IF;
 21  END;
 22  /
Table altered successfully

PL/SQL procedure successfully completed.

好了,表被成功修改了,让我们检查一下:

代码语言:javascript
运行
AI代码解释
复制
SQL> DESC t;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 A                                                  VARCHAR2(20)

SQL>

我见过使用groovy脚本的应用程序很少,该脚本执行所有检查,并根据对data_type、data_size、data_precision、data_scale等的检查准备ALTER语句。

对于不同的检查,您需要添加更多的IF-ELSE块。这是增加VARCHAR2数据类型的大小的一个示例。您需要在减少列大小的同时引发exception,这取决于该列是否有任何现有的数据或not...and,等等...

您可以创建单独的函数来检查元数据并返回值。

例如,

数值类型:

代码语言:javascript
运行
AI代码解释
复制
CREATE OR REPLACE FUNCTION is_numeric (i_col_name)...
<using the above logic>
IF v_type       ='NUMBER' THEN
<do something>
RETURN 1;

字符类型:

代码语言:javascript
运行
AI代码解释
复制
CREATE OR REPLACE FUNCTION is_string (i_col_name)...
<using the above logic>
IF v_type       ='VARCHAR2' THEN
<do something>
RETURN 1;
票数 0
EN

Stack Overflow用户

发布于 2015-06-03 08:57:38

我想到了两种方法,但这两种方法都不能给你真正想要的东西。

第一个,我提到这纯粹是为了描述它是你真正想要的,而不是因为它是实用的,是编写一个工具来解析你的SQL脚本更改,并像Oracle一样对对象应用相同的规则,即alter table modify column -并检查列值是否没有超过新的长度。这是一项巨大的任务,当您考虑到更改将是级联/复合时,您也需要迎合这一点。我也不认为它会很快--如果您对一个x百万行的表上的一个非索引列进行了修改,那么该工具将需要扫描可能导致alter失败的数据。无论Oracle使用什么内部魔法来确定这一点,该工具都无法使用。

我使用的方法也不完全是您想要的,就是从生产环境中克隆一个数据库,并减少数据。我主要通过脚本来完成这项工作,这样我就可以进行控制,而不需要依赖特殊的权限/dba访问权限。然后,我针对此测试我的部署脚本,并迭代地执行此操作,直到我有一个干净的构建。我使用我构建的具有重新启动功能的部署框架,因此,如果在121的第63步部署失败,它会给我一个重试/跳过/中止选项,如果我中止它,它可以从失败的步骤重新启动。一旦我对我的开发版本感到满意,我就会在一个与生产同步的数据库上进行测试-这往往会解决数据和/或性能方面的问题。

现在,另一种可能的方法可能是查看闪回。我不确定flashback是否也能处理DDL,但如果它能处理DDL,并且假设在您的dev/test数据库上启用了它(一个很大的假设),那么这可能是一个值得探索的途径。

票数 0
EN

Stack Overflow用户

发布于 2015-06-03 11:59:28

试用我的工具CORT - www.softcraftltd.co.uk/cort

它是免费的,并且是开源的。也许你能找到你需要的东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30614491

复制
相关文章
Windows 7上IIS出现http 500错误
昨天开始在我的windows7上出现了Http 500错误,查看系统的应用程序日志,有如下两条错误: 1: 日志名称: Application 2: 来源: Microsoft-Windows-IIS-W3SVC-WP 3: 日期: 2010/8/7 20:58:37 4: 事件 ID: 2268 5: 任务类别: 无 6: 级别: 错误 7: 关键
张善友
2018/01/19
1.7K0
nginx 访问.php文件正常,访问.html文件500错误
Nginx遇上Access Denied提示怎么解决 这几天在摆弄linux下面的各种服务器,对nginx非常有兴趣。
友儿
2022/09/11
1.7K0
关于http 500错误的小结分享
一般情况下,http 500内部服务器(HTTP-Internal Server Error)错误说明IIS服务器无法解析ASP代码,访问一个静态页面试试是否也出现这个问题。
用户7053485
2020/03/12
6.4K0
http500内部服务器错误什么意思?http500内部服务器错误如何解决?
平时使用电脑的时候都是回遇到各种问题的,即使再好的机器使用久了也难免会遇到问题,计算机作为一种精密的机器,是由多种部件组成才可以正常运行的,所以在使用过程中遇到的问题还是比较多的,除了硬件问题之外软件问题更是经常会遇到,比如常见的网络崩溃、死机蓝屏等等,在访问互联网的时候会出现http500内部服务器错误这种问题,那么http500内部服务器错误什么意思?http500内部服务器错误如何解决?
用户8715145
2021/09/10
2.8K0
显示http500内部服务器错误,http500内部服务器错误,小编教你HTTP 500 内部服务器错误怎么解决…
在使用电脑的时候,出现问题是我们最不想碰到的事情了。当打开网站的时候碰到“HTTP500内部服务器错误”,这会让我们非常的心烦,有时候就是因为这些故障要折腾很久,很闹心的,下面,小编给大家带来了HTTP 500 内部服务器错误的解决图文。
全栈程序员站长
2022/09/21
6.8K0
显示http500内部服务器错误,http500内部服务器错误,小编教你HTTP 500 内部服务器错误怎么解决…
如何定位导致 Django 错误的文件
在 Django 开发中,当发生错误时,定位问题所在的文件和代码行是调试的重要步骤。以下是一些常用的方法和技巧来定位导致 Django 错误的文件:
华科云商小徐
2025/01/10
1130
HTTP状态500-内部服务器错误[通俗易懂]
SSM整合时出现的问题 起初关注点一直在Mapper.xml上,CSDN查询解决方法大致在这样几种。 1.SQL语句问题 2.resultType返回类型问题(List集合中的参数类型) 3.database.properties数据库配置文件问题(Mysql8以上加时区,文件多写了空格,少写了jdbc.)
全栈程序员站长
2022/09/22
5.9K0
HTTP状态500-内部服务器错误[通俗易懂]
Docker 部署静态Html文件
Create Html File <h1>Hello Html</h1> Create Dockerfile FROM nginx:alpine COPY . /usr/share/nginx/html Build Docker Image docker build -t webserver-ng:v1 . 注意最后的点,表示,运行当前目录的Dockerfile 查看创建的镜像 docker images Run docker run -d -p 80:80 webserver-ng:v1
用户2146693
2021/12/28
4.1K0
Docker 部署静态Html文件
JQuery Ajax Post导致500内部服务器错误
$.ajaxSetup({data:{csrfmiddlewaretoken:'{{csrf_token}}'}});
用户4645133
2019/02/15
4.5K0
Django 文件上传时出现 500 错误
在 Django 中,文件上传时出现 500 错误通常是服务器端未处理的异常。这类错误可能有多种原因,包括配置问题、权限问题或上传逻辑中的错误。以下是一些常见的导致 Django 文件上传失败并出现 500 错误的原因和解决方法。
华科云商小徐
2024/09/10
1920
Django 文件上传时出现 500 错误
http 500 Internal Server Error的错误 ajax请求SpringMVC后台中返回500 Internal Server Error
使用httprequester接口测试能返回数据,但是用ajax返回json格式的时候返回报500Internal Server Error。
青山师
2023/05/04
8630
映射重复导致的错误:Ambiguous handler methods mapped for HTTP path
  出现Ambiguous Mapping异常时,找到同一请求路径映射到两个方法的地方,修改即可。使这两个方法有区分即可。注意:要一并修改对应的jsp上的请求路径。
黑泽君
2018/12/13
5.9K0
映射重复导致的错误:Ambiguous handler methods mapped for HTTP path
为什么Handler会导致内存泄漏?
最近在思考关于内存泄露的问题,进而想到了关于我们最常见和熟知的Handler在Activity内导致的内存泄漏的问题,这个问题相信作为开发都是很熟悉的,但是这背后更多的细节和导致泄漏的不同的情况,可能很多人就没有那么了解和清楚了,因此这次和大家分享一下什么情况下会导致内存泄漏,以及内存泄漏背后的故事。
没关系再继续努力
2021/11/22
1.3K0
出现500错误
早上闲来无事,在cpanel后台转悠,看到了hotlink保护,想想是不是设置一下防盗链呢,这个博客开始到现在也没有几张有价值的图片,其实防盗链没所谓的,凑凑热闹设置一下,以前用过cpanel后台的免费空间,设置过hotlink,所以就没在意,设置完关掉了。
空空裤兜
2023/03/03
1.6K0
HTTP 500内部服务器错误的解决方法(重装IIS)
1. 运行:regsvr32 %windir%/system32/vbscript.dll (其实这一步也可以省,确保万一,还是执行吧)
会长君
2023/04/26
1.9K0
使用HTML制作静态网站作业——我的校园运动会(HTML+CSS)
✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (1000套) 】 🧡 程序员有趣的告白方式:【💌HTML七夕情人节表白网页制作 (110套) 】 🌎超炫酷的Echarts大屏可视化源码:【🔰 echarts大屏展示大数据平台可视化(150套) 】 🎁 免费且实用的WEB前端学习指南: 【📂web前端零基础到高级学习视频教程 120G干货分享】 🥇 关于作者
IT司马青衫
2022/08/23
1.4K0
使用HTML制作静态网站作业——我的校园运动会(HTML+CSS)
为什么StampedLock会导致CPU100%?
StampedLock 是 Java 8 引入的一种高级的锁机制,它位于 java.util.concurrent.locks 包中。与传统的读写锁(ReentrantReadWriteLock)相比,StampedLock 提供了更灵活和更高性能的锁解决方案,尤其适用于读操作远多于写操作的场景。
磊哥
2024/07/18
1020
错误修改/etc/sudoers文件导致无法sudo的解决方式
开两个session 第一步:在以第一个session上输入 echo $$ 第二步:在第二个session上输入 pkttyagent --process xxx 第三步:回到第一个session中,输入 pkexec visudo 第四步:回到第二个session,你会发现Bash提示你进行权限认证,输入密码后,再回到第一个session 第五步:回到第一个session后就是我们熟悉的visudo界面。 保存并退出 Ctrl + O
buiu
2021/11/25
1.5K0
c#生成静态html文件,封装类
由于这段时间比较轻松,于是想到很多的企业网站,新闻网站需要将页面静态化,于是写了个封装类来实现静态文件的生成,思路比较简单,但未完善,网友可根据自己的思路将此类扩展,运用了简单工厂模式(本来刚开始看设计模式,是个好书),好了,废话不多说,先来看看静态类的父类:StaticBase(抽象类)
全栈程序员站长
2021/12/21
2.8K0
[linux][bcache]bcache导致的xfs文件系统错误问题分析
前言: 频繁见到xfs报错,文件系统出现了破损。 目前有两种情况下使用xfs: 其一,在物理机上使用启用了bcache的blk设备,格式化成xfs直接使用,这种情况下,运行过很久,都没有出现问题; 其二,在物理机上,使用scsi passthrough技术,把磁盘都passthrouge给虚拟机,在虚拟机内部启用bcache,格式化成xfs,运行不久,虚拟机里面就会出现xfs的文件系统破损。 分析: 1,xfs文件系统破损 基于上述问题的描述,在物理机上长期使用xfs,没遇到问题,可以基本判断出来,当前的
皮振伟
2018/04/09
2.5K0
[linux][bcache]bcache导致的xfs文件系统错误问题分析

相似问题

Vue.js - onclick事件不会触发

137

反应onClick事件不触发

21

OnClick事件不绑定/触发

11

IE中不触发ImageButton OnClick事件

13

Spark按钮不触发onClick事件

18
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文