oracle中表数据更新提交后自动被还原的原因查找

  今天接到某现场实施同事的远程求助,说是某张表的数据通过plsql更新提交后,数据还是原来的旧数据,需要帮忙查看原因!一开始我是不信的,除非有触发器存在导致数据更新后被还原,但是查看dba_source后没有找到相关触发器,排除触发器的原因,并且其他的DML操作一切正常。后来经过某位老哥的提醒,最终找出原因,下面请看具体过程👇

问题现象:

排查思路:

  • 查找出发器
    在这里插入图片描述查看text后确认没有相关业务用户的触发器!但是前面的现象确实commit后查询还是原先的数据,那改怎么办呢❓

这里我们用到oracle的表级审计

  1. 开启审计参数
SQL> show parameter audit
NAME                                         TYPE       VALUE
----------------------------------------------- ------------------------------
audit_file_dest                      string      /u01/app/oracle/admin/mydb/adump
audit_sys_operations                boolean   FALSE
audit_syslog_level                 string
audit_trail                                string     NONE
SQL> alter system set audit_trail=db_extended scope=spfile;

2. 重启数据库

SQL> shutdown immediate;
SQL> startup
ORACLE instance started.
  
Total System  Global  Area  599785472 bytes
Fixed  Size               2085776 bytes
Variable  Size                 192941168 bytes
Database  Buffers      398458880 bytes
Redo Buffers                 6299648 bytes
Database  mounted.
Database  opened.
SQL> show parameter audit
  
NAME                                         TYPE       VALUE
----------------------------------------------- ------------------------------
audit_file_dest                      string      /u01/app/oracle/admin/mydb/adump
audit_sys_operations                    boolean   FALSE
audit_syslog_level                 string
audit_trail                                string     DB, EXTENDED

3. 设置对表进行审计

SQL> audit all on ZFXFZB.XSJBXXB by access;

重复上述跟新操作

SQL> update zfxfzb.xsjbxxb set csrq='2001-1-01' where xh='202104030219';
SQL> select csrq from zfxfzb.xsjbxxb where xh='202104030219';

结果与预期一致,crsq字段还是没有被更新成功

4. 查询审计记录

SELECT  USERNAME,
       USERHOST,
       TIMESTAMP ,
       OWNER,
       OBJ_NAME,
       ACTION_NAME,
       SQL_TEXT
  FROM  DBA_AUDIT_TRAIL
  WHERE  OBJ_NAME= 'XSJBXXB' and action_name ='UPDATE'
  ORDER  BY  TIMESTAMP ;

在这里插入图片描述从审计日志能明显发现在我们执行了update操作之后,主机zhxy-zfauth也立马执行了update操作。在提交执行sql和主机名给到现场同事后,立马发现这是由数据中心交换服务器产生的相关操作,在修改数据中心程序后,该表能被正常更新💕💕

### Oracle 数据库查询特殊字符的方法 在 Oracle 数据库中,查询包含特殊字符的数据可以通过多种方法实现。以下是几种常见且有效的方式: #### 使用 `ESCAPE` 关键字处理通配符 当查询条件中的特殊字符涉及 `%` 或 `_` 这样的通配符时,可以使用 `ESCAPE` 来指定转义字符,从而让这些通配符被解释为其本身的含义而非模式匹配功能[^2]。 ```sql SELECT * FROM table_name WHERE column_name LIKE '%\%%' ESCAPE '\'; ``` 此语句表示查找列 `column_name` 中包含实际百分号 (`%`) 的记录。`\` 是此处定义的转义字符,用于告诉数据库将后续的 `%` 解释为普通字符而不是通配符。 --- #### 替换特殊字符为 ASCII 值 对于某些无法直接输入或者容易引起解析错误的特殊字符(如 `&`),可以将其替换为对应的 ASCII 字符编码来存储或检索数据[^4]。例如,在 SQL 查询中可以用函数 `CHR()` 将特定数值转换成相应字符。 ```sql -- 插入带有 '&' 符号的数据 INSERT INTO test_table (name) VALUES ('Tom' || CHR(38) || 'Jerry'); -- 查找含有 '&' 符号的数据 SELECT * FROM test_table WHERE name LIKE '%&%' ESCAPE ''; ``` 这里需要注意的是,如果表单提交过程中已经自动对一些敏感符号进行了 HTML 实体化,则可能还需要额外考虑如何还原它们到原始状态再做比较操作。 --- #### 处理其他复杂情况下的特殊字符 针对更复杂的场景比如涉及到版权标志 ©、商标标记 ™ 等 Unicode 编码范围内的非标准打印字符的情况,首先要确认目标字段的实际编码格式是否能够支持该类别的字符集显示正确无误[^1]。假设当前环境确实兼容 UTF-8/ZHS16GBK 类型的话,那么可以直接利用正则表达式来进行精确筛选符合条件的结果集合。 ```sql -- 利用 REGEXP_LIKE 函数检测是否存在某个Unicode区间的任意成员 SELECT * FROM articles WHERE REGEXP_LIKE(body_text, '[[:punct:]]'); ``` 上述例子展示了怎样借助正则表达式的强大能力去识别文档主体部分里所有的标点符号类别项目,当然也可以调整参数限定至具体的某几个感兴趣的目标子集之内。 --- ### 总结 综上所述,无论是简单的通配符冲突解决还是深入探讨各种异国文字以及图形化的呈现需求等方面,Oracle 提供了丰富的工具箱帮助开发者顺利完成任务。合理运用像 `LIKE ... ESCAPE`, `REGEXP_LIKE()`, 和字符串拼接技术等手段,可以让我们的应用程序更加健壮可靠面对多样性的挑战。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

运维之牛马

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

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

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

打赏作者

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

抵扣说明:

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

余额充值