【致远FAQ】部署环境问题(ORA-01430:表中已存在要添加的列)

本文描述了一次因测试环境配置不当导致生产环境缓存污染的问题。主要表现为表单信息异常,通过停止服务、清理Redis缓存等步骤解决了问题,并提出了部署测试环境时应注意的事项。

问题现象

1)表单所属人变回以前人员

2)表单样式变回以前版本,修改表单样式报错“表中已存在要添加的列”

3)单位管理员手工刷新问题表单缓存,该表单样式以及所属人信息可以恢复

问题原因以及解决方法

克隆生产环境集群从节点作为测试环境,修改了数据库连接指向测试数据库,但是没有修改redis配置,测试环境连接生产环境redis启动服务导致缓存污染;
解决方法:
1)停止生产环境集群所有节点协同服务
2)停止redis服务,更名redis/bin/dump.rdb文件,启动redis服务
3)启动生产环境协同服务,已经产生的错误数据无法挽回

部署测试环境注意事项

1)优先要求测试环境与生产环境网络隔离,互不干扰
2)建议部署测试环境采用全新部署以后打上生产环境补丁包以及客开包的方式,或者全新部署以后用生产环境ApacheJetspeed\webapps目录替换测试环境该目录(非覆盖),客开注意检查有无生产环境配置写入代码目录或者配置文件
3)测试环境禁止连接生产环境数据库
4)测试环境禁止连接生产环境redis
5)测试环境禁止连接生产环境upload
6)测试环境协同配置工具里插件配置,禁止连接生产环境插件地址

 

 

### ❌ 错误解释:`ORA-01430: column being added already exists in table` 这个 Oracle 数据库错误的意思是: > **你正在尝试向一个添加一个已经存在。** Oracle 不允许在同一个存在两个同名的,因此当你执行 `ALTER TABLE ... ADD COLUMN` 语句时,如果该名**已经存在于目标中**,就会抛出 `ORA-01430` 错误。 --- ### ✅ 示例场景 ```sql -- 假设有一个 users CREATE TABLE users ( id NUMBER, name VARCHAR2(50) ); -- 第一次添加 email (成功) ALTER TABLE users ADD (email VARCHAR2(100)); -- 再次运行同样的语句(报错 ORA-01430) ALTER TABLE users ADD (email VARCHAR2(100)); ``` 👉 执行第二次时就会报错: ``` ORA-01430: column being added already exists in table ``` 因为 `email` 已经存在了。 --- ### ✅ 解决方案 #### ✅ 方法一:添加前先检查是否存在(推荐) 使用数据字典视图 `USER_TAB_COLUMNS` 来判断是否已存在: ```sql -- 检查是否存在,不存在添加 BEGIN FOR col IN ( SELECT column_name FROM user_tab_columns WHERE table_name = 'USERS' AND column_name = 'EMAIL' ) LOOP IF col.column_name IS NOT NULL THEN RAISE_APPLICATION_ERROR(-20001, 'Column EMAIL already exists.'); END IF; END LOOP; -- 如果没找到,则添加 EXECUTE IMMEDIATE 'ALTER TABLE users ADD (email VARCHAR2(100))'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -1430 THEN -- 忽略重复错误(可选) RAISE; END IF; END; / ``` 或者更简洁地使用异常捕获处理: #### ✅ 方法二:使用异常块忽略 ORA-01430(适合脚本自动执行) ```sql BEGIN ALTER TABLE users ADD (email VARCHAR2(100)); EXCEPTION WHEN OTHERS THEN IF SQLCODE != -1430 THEN -- 只忽略“存在”错误 RAISE; -- 其他错误继续抛出 END IF; END; / ``` > 这种方式常用于数据库升级脚本中,确保脚本幂等性(多次运行不报错)。 --- #### ✅ 方法三:使用条件判断(PL/SQL 中安全添加) ```sql DECLARE col_exists NUMBER := 0; BEGIN -- 查询是否存在 SELECT COUNT(*) INTO col_exists FROM user_tab_columns WHERE table_name = 'USERS' AND column_name = 'EMAIL'; -- 仅当存在时才添加 IF col_exists = 0 THEN EXECUTE IMMEDIATE 'ALTER TABLE users ADD (email VARCHAR2(100))'; DBMS_OUTPUT.PUT_LINE('Column EMAIL added.'); ELSE DBMS_OUTPUT.PUT_LINE('Column EMAIL already exists.'); END IF; END; / ``` --- ### 🔍 如何查看某张的所有? ```sql DESCRIBE users; -- 或者使用查询: SELECT column_name, data_type, data_length FROM user_tab_columns WHERE table_name = 'USERS' ORDER BY column_id; ``` 注意:名默认是大写的,如果你用小写建,请加上双引号或使用 `LOWER()` 处理。 --- ### 🛠️ 最佳实践建议 | 建议 | 说明 | |------|------| | ✅ 使用大写名和名 | 避免大小写敏感问题 | | ✅ 在部署脚本中加入存在性检查 | 提高脚本健壮性和可重复执行能力 | | ✅ 使用版本化数据库迁移工具 | 如 Liquibase、Flyway,避免手动维护 SQL 脚本 | | ✅ 记录变更日志 | 明确哪些已被添加 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

致远OA开发实施运维支持

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值