如何校验 MySQL&Oracle 时间字段合规性?

这篇具有很好参考价值的文章主要介绍了如何校验 MySQL&Oracle 时间字段合规性?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作者:余振兴

爱可生 DBA 团队成员,热衷技术分享、编写技术文档。

本文来源:原创投稿

  • 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

背景信息

在数据迁移或者数据库低版本升级到高版本过程中,经常会遇到一些由于低版本数据库参数设置过于宽松,导致插入的时间数据不符合规范的情况而触发报错,每次报错再发现处理起来较为麻烦,是否有提前发现这类不规范数据的方法,以下基于 Oracle 和 MySQL 各提供一种可行性方案作为参考。

Oracle 时间数据校验方法

2.1 创建测试表并插⼊测试数据

CREATE TABLE T1(ID NUMBER,CREATE_DATE VARCHAR2(20));

INSERT INTO T1 SELECT 1, '2007-01-01' FROM DUAL;
INSERT INTO T1 SELECT 2, '2007-99-01' FROM DUAL;            -- 异常数据
INSERT INTO T1 SELECT 3, '2007-12-31' FROM DUAL;
INSERT INTO T1 SELECT 4, '2007-12-99' FROM DUAL;            -- 异常数据
INSERT INTO T1 SELECT 5, '2005-12-29 03:-1:119' FROM DUAL;  -- 异常数据
INSERT INTO T1 SELECT 6, '2015-12-29 00:-1:49' FROM DUAL;   -- 异常数据

2.2 创建对该表的错误日志记录

  • Oracle 可以调用 DBMS_ERRLOG.CREATE_ERROR_LOG 包对 SQL 的错误进行记录,用来记录下异常数据的情况,十分好用。

  • 参数含义如下

    • T1 为表名
    • T1_ERROR 为对该表操作的错误记录临时表
    • DEMO 为该表的所属用户
EXEC DBMS_ERRLOG.CREATE_ERROR_LOG('T1','T1_ERROR','DEMO');

2.3 创建并插入数据到临时表,验证时间数据有效性

-- 创建临时表做数据校验
CREATE TABLE T1_TMP(ID NUMBER,CREATE_DATE DATE);

-- 插入数据到临时表验证时间数据有效性(增加LOG ERRORS将错误信息输出到错误日志表)
INSERT INTO T1_TMP 
SELECT ID, TO_DATE(CREATE_DATE, 'YYYY-MM-DD HH24:MI:SS')
FROM T1 
LOG ERRORS INTO T1_ERROR REJECT LIMIT UNLIMITED;

2.4 校验错误记录

SELECT * FROM DEMO.T1_ERROR;

如何校验 MySQL&Oracle 时间字段合规性?

其中 ID 列为该表的主键,可用来快速定位异常数据行。

MySQL 数据库的方法

3.1 创建测试表模拟低版本不规范数据

-- 创建测试表
SQL> CREATE TABLE T_ORDER(
    ID BIGINT AUTO_INCREMENT PRIMARY KEY,
    ORDER_NAME VARCHAR(64),
    ORDER_TIME DATETIME);

-- 设置不严谨的SQL_MODE允许插入不规范的时间数据
SQL> SET SQL_MODE='STRICT_TRANS_TABLES,ALLOW_INVALID_DATES';

SQL> INSERT INTO T_ORDER(ORDER_NAME,ORDER_TIME) VALUES 
    	('MySQL','2022-01-01'),
    	('Oracle','2022-02-30'),
    	('Redis','9999-00-04'),
    	('MongoDB','0000-03-00');

-- 数据示例
SQL> SELECT * FROM T_ORDER;
+----+------------+---------------------+
| ID | ORDER_NAME | ORDER_TIME          |
+----+------------+---------------------+
|  1 | MySQL      | 2022-01-01 00:00:00 |
|  2 | Oracle     | 2022-02-30 00:00:00 |
|  3 | Redis      | 9999-00-04 00:00:00 |
|  4 | MongoDB    | 0000-03-00 00:00:00 |
+----+------------+---------------------+

3.2 创建临时表进行数据规范性验证

-- 创建临时表,只包含主键ID和需要校验的时间字段
SQL> CREATE TABLE T_ORDER_CHECK(
    ID BIGINT AUTO_INCREMENT PRIMARY KEY,
    ORDER_TIME DATETIME);
  
-- 设置SQL_MODE为5.7或8.0高版本默认值
SQL> SET SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

-- 使用INSERT IGNORE语法插入数据到临时CHECK表,忽略插入过程中的错误
SQL> INSERT IGNORE INTO T_ORDER_CHECK(ID,ORDER_TIME) SELECT ID,ORDER_TIME FROM T_ORDER;

3.3 数据比对

将临时表与正式表做关联查询,比对出不一致的数据即可。

SQL> SELECT 
	T.ID,
	T.ORDER_TIME AS ORDER_TIME,
	TC.ORDER_TIME AS ORDER_TIME_TMP
FROM T_ORDER T INNER JOIN T_ORDER_CHECK TC 
ON T.ID=TC.ID
WHERE T.ORDER_TIME<>TC.ORDER_TIME;

+----+---------------------+---------------------+
| ID | ORDER_TIME          | ORDER_TIME_TMP      |
+----+---------------------+---------------------+
|  2 | 2022-02-30 00:00:00 | 0000-00-00 00:00:00 |
|  3 | 9999-00-04 00:00:00 | 0000-00-00 00:00:00 |
|  4 | 0000-03-00 00:00:00 | 0000-00-00 00:00:00 |
+----+---------------------+---------------------+

一个取巧的小方法

对时间字段用正则表达式匹配,对有严谨性要求的情况还是得用以上方式,正则匹配烧脑。

-- Oracle 数据库
SELECT * FROM  T1 WHERE NOT REGEXP_LIKE(CREATE_DATE,'^((?:19|20)\d\d)-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$');

	ID CREATE_DATE
---------- --------------------
	 2 2007-99-01
	 4 2007-12-99
	 5 2005-12-29 03:-1:119
	 6 2015-12-29 00:-1:49
	 
-- MySQL 数据库
-- 略,匹配规则还在调试中

关于 SQLE

爱可生开源社区的 SQLE 是一款面向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。文章来源地址https://www.toymoban.com/news/detail-501689.html

SQLE 获取

类型 地址
版本库 https://github.com/actiontech/sqle
文档 https://actiontech.github.io/sqle-docs/
发布信息 https://github.com/actiontech/sqle/releases
数据审核插件开发文档 https://actiontech.github.io/sqle-docs-cn/3.modules/3.7_auditplugin/auditplugin_development.html

到了这里,关于如何校验 MySQL&Oracle 时间字段合规性?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 外汇监管牌照解析:确保交易安全与合规性

    外汇交易中,资金安全与平台监管是大家最关心的话题。监管是评估外汇经纪商是否值得信赖、是否具备相关资质的关键依据,因此选择一家拥有海外合法监管的经济商至关重要。 那么,今天我们就来聊聊全球权威的几大监管机构 —nbsp; FCA、ASIC、NFA、FSA、CIMA。 FCA(英国金

    2024年02月20日
    浏览(45)
  • 第三十二章:CRM平台的安全与合规性

    客户关系管理(CRM)平台是企业与客户之间的关键沟通和交流桥梁。CRM平台存储了大量客户信息,包括个人信息、交易记录、客户需求等。因此,CRM平台的安全与合规性至关重要。 本章将深入探讨CRM平台的安全与合规性,涉及到的核心概念、算法原理、最佳实践、应用场景和工

    2024年02月22日
    浏览(53)
  • 未通过OVF规范⼀致性或虚拟硬件合规性检查

    当在导入vulnhub靶场的时候,会出现:未通过OVF规范⼀致性或虚拟硬件合规性检查 按照网上大佬的建议,重新下载另一个ovf将原来的文件内的全部替换具体操作参考: https://blog.csdn.net/qq_53634424/article/details/127459384 但是,替换以后重新导入靶场文件,还是显示:未通过OVF规范⼀

    2024年02月04日
    浏览(37)
  • 合规性问题:策略未符合最新的安全标准或法规要求

    在企业中制定和管理网络与信息安全政策是至关重要的任务之一。然而,有时候企业中的防火墙策略并未完全符合现有的网络安全标准和法规的要求。本文将对这一问题进行剖析并给出相应的解决措施。 问题描述 企业的防火墙策略可能因为以下原因不符合最新的安全和法规要

    2024年01月17日
    浏览(43)
  • 【容器化应用程序设计和开发】2.5 容器化应用程序的安全性和合规性考虑

    往期回顾: 第一章:【云原生概念和技术】 第二章:2.1 容器化基础知识和Docker容器 第二章:2.2 Dockerfile 的编写和最佳实践 第二章:2.3 容器编排和Kubernetes调度 第二章:2.4 容器网络和存储 容器化应用程序是将应用程序和其依赖项打包到一个独立的、可移植的容器中,以便在

    2024年02月15日
    浏览(52)
  • 【Azure】发掘 Azure 用于治理和合规性工具:探索 Azure 蓝图、策略、资源锁和信任门户 | 文末送书

    在当今数字化的云计算时代,Azure云平台作为全球领先的云服务提供商,为组织和企业提供了强大的资源管理和安全性功能。本文主要针对 Azure 初学者,或者备考AZ-900的同学,带领大家探讨几个关键的 Azure 服务,帮助读者全面了解 Azure 蓝图、Azure 策略和 Azure 资源锁以及 Az

    2024年02月16日
    浏览(46)
  • 【Azure上云项目实战】 合规性的身份验证与访问控制:在 Azure 中实现符合 PCI DSS 要求的架构设计

    各位博客阅读者们以及对云计算感兴趣的小伙伴们,微软 Azure 云的基础部分更新已经接近了尾声,从上周末到这周三,我一直没有更文,最近主要 focus 在后续如何更新以及博客内容梳理上,接下来的一小段时间我会将 Azure 基础的后续零散更新完毕,这主要包括剩余的两个部

    2024年02月14日
    浏览(44)
  • Mysql及Navicat中如何设置字段自动填充当前时间以及修改时间。

    ​该文章讲解了创建时间及修改时间如何通过函数自动填充,并演示了以下几种方式实现列自动填充创建时间及修改时间: 创建表时设置字段为自动更新时间列。 添加新字段为自动更新时间列。 更新已有字段为自动更新时间列。 通过navicat设置字段为自动更新时间列。 CUR

    2024年02月02日
    浏览(70)
  • MySQL字段的时间类型该如何选择?千万数据下性能提升10%~30%🚀

    在MySQL中时间类型的选择有很多,比如:date、time、year、datetime、timestamp... 在某些情况下还会使用整形int、bigint来存储时间戳 根据节省空间的原则,当只需要存储年份、日期、时间时,可以使用year、date、time 如果需要详细的时间,可以选择datetime、timestamp或者使用整形来存储

    2024年02月08日
    浏览(56)
  • Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL

     导航: 【Java笔记+踩坑汇总】Java基础+进阶+JavaWeb+SSM+SpringBoot+瑞吉外卖+SpringCloud+黑马旅游+谷粒商城+学成在线+MySQL高级篇+设计模式+面试题汇总+源码_vincewm的博客-CSDN博客 目录 一、基本区别 1.1 基本特性 1.2 Oracle和MySQL如何做技术选型? 1.3 RDBMS和ORDBMS的区别 1.4 默认端口号和用

    2024年02月12日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包