0

0

Oracle数据库:利用触发器实现列的SYSDATE自动更新

心靈之曲

心靈之曲

发布时间:2025-11-11 21:27:01

|

571人浏览过

|

来源于php中文网

原创

Oracle数据库:利用触发器实现列的SYSDATE自动更新

本文将详细介绍如何在oracle数据库中,通过创建数据库触发器,实现数据表列(如`dat_update`)在每次插入或更新操作时自动获取并存储当前的数据库系统日期(`sysdate`)。针对应用层(如hibernate的`@columntransformer`)难以有效管理数据库原生时间戳的场景,数据库触发器提供了一种可靠且高效的解决方案,确保数据的时间戳始终由数据库精确控制。

在数据库应用开发中,一个常见的需求是自动记录数据行的创建时间或最后更新时间。尤其是在Oracle数据库环境中,我们通常希望一个特定的日期类型列(例如dat_update)能够自动填充数据库服务器当前的系统日期和时间(SYSDATE),而无需应用程序显式传递该值。虽然一些ORM框架(如Hibernate)提供了注解来处理时间戳,但对于需要完全由数据库层面控制和保证其准确性的场景,数据库触发器往往是更健壮、更可靠的选择。

为什么选择数据库触发器?

当应用程序尝试通过ORM工具(如Hibernate)的@ColumnTransformer来注入数据库的SYSDATE时,可能会遇到挑战。@ColumnTransformer主要用于在读取或写入数据时,对列的值进行转换。然而,对于SYSDATE这种完全由数据库在操作发生时生成的、不可预测的值,让应用程序层来“写入”一个数据库函数的结果,其语义上并不直接且可能导致不一致。

数据库触发器是直接在数据库服务器上执行的程序,它们在特定的数据库事件(如INSERT、UPDATE、DELETE)发生时自动执行。通过在INSERT或UPDATE操作发生之前触发一个逻辑,我们可以确保SYSDATE在数据真正写入或更新到表中时被精确捕获和赋值,从而保证时间戳的准确性和一致性,且与任何应用层逻辑解耦。

实现步骤:使用Oracle数据库触发器

以下是使用Oracle数据库触发器实现列自动更新SYSDATE的详细步骤。

1. 创建目标数据表

首先,我们需要一个包含日期类型列的数据表。例如,创建一个名为test的表,其中包含一个用于存储更新日期的dat_update列。

CREATE TABLE test (
    id         NUMBER GENERATED ALWAYS AS IDENTITY,
    name       VARCHAR2(10),
    dat_update DATE
);

说明:

新视窗CMS企业管理程序 5.1
新视窗CMS企业管理程序 5.1

新视窗企业管理系统是一款小巧、实用、利于后续开发的ASP程序。适合大中小型企业的网站建设。1、新闻管理 2、产品管理 3、订单管理 4、广告管理 5、下载管理 6、留言管理 8、单页栏目(如企业简介,资质荣誉)9、人才招聘等等。 新视窗企业管理系统 5.1 更新日志:1、修改产品列表的图片自动缩略,防止图片变形.2、修改后台添加产品分类时,排序ID不写入数据库的错误.3、修改首页企业简介的链接地址

下载
  • id NUMBER GENERATED ALWAYS AS IDENTITY: 定义一个自增主键列。
  • name VARCHAR2(10): 一个普通的字符串列。
  • dat_update DATE: 我们的目标列,用于存储SYSDATE。

2. 创建数据库触发器

接下来,创建一个BEFORE INSERT OR UPDATE类型的触发器。这个触发器会在每次向test表插入新行或更新现有行之前执行。

CREATE OR REPLACE TRIGGER trg_biu_test
BEFORE INSERT OR UPDATE ON test
FOR EACH ROW
BEGIN
  :new.dat_update := SYSDATE;
END;
/

说明:

  • CREATE OR REPLACE TRIGGER trg_biu_test: 创建或替换一个名为trg_biu_test的触发器。
  • BEFORE INSERT OR UPDATE ON test: 指定触发器在test表的INSERT或UPDATE操作发生之前触发。
  • FOR EACH ROW: 表示这是一个行级触发器,即对于受操作影响的每一行都会执行一次。
  • :new.dat_update := SYSDATE;: 这是触发器的核心逻辑。:new伪记录变量代表正在插入或更新的行的新值。我们将数据库的当前系统日期和时间(SYSDATE)赋值给dat_update列。

3. 测试触发器功能

现在,我们可以通过执行INSERT和UPDATE操作来验证触发器是否按预期工作。为了更清晰地看到日期格式,我们可以临时修改会话的日期显示格式。

-- 可选:设置会话日期格式,以便更清晰地查看日期和时间
ALTER SESSION SET NLS_DATE_FORMAT = 'dd.mm.yyyy hh24:mi:ss';

-- 插入新数据
INSERT INTO test (name) VALUES ('Little');
SELECT * FROM test ORDER BY id;

-- 再次插入新数据
INSERT INTO test (name) VALUES ('Foot');
SELECT * FROM test ORDER BY id;

-- 更新现有数据
UPDATE test SET name = 'Yasuda' WHERE name = 'Little';
SELECT * FROM test ORDER BY id;

预期输出示例:

首次插入:

        ID NAME       DAT_UPDATE
---------- ---------- -------------------
         1 Little     01.12.2022 20:22:03

第二次插入:

        ID NAME       DAT_UPDATE
---------- ---------- -------------------
         1 Little     01.12.2022 20:22:03
         2 Foot       01.12.2022 20:22:19

更新操作后:

        ID NAME       DAT_UPDATE
---------- ---------- -------------------
         1 Yasuda     01.12.2022 20:22:33 -- 注意:此行的dat_update已更新
         2 Foot       01.12.2022 20:22:19

从输出中可以看出,每次INSERT或UPDATE操作后,dat_update列都会自动更新为操作发生时的SYSDATE。

注意事项与最佳实践

  1. ORM工具集成: 如果使用Hibernate等ORM工具,对于由数据库触发器自动填充的列,通常不需要在实体类中显式设置其值。ORM在执行INSERT或UPDATE后,可以重新加载实体以获取数据库生成的值。某些ORM注解(如JPA的@CreationTimestamp或@UpdateTimestamp)旨在由ORM自身管理时间戳,但当数据库触发器接管时,这些注解可能需要调整或禁用,以避免冲突。最简单的方法是让ORM在写入时忽略该列,或在读取时正常映射。
  2. 时间戳类型选择: SYSDATE返回数据库服务器的当前日期和时间。如果需要更高的精度(包含毫秒)或时区信息,可以考虑使用SYSTIMESTAMP。
  3. 性能影响: 数据库触发器会增加DML操作的开销。然而,对于简单的SYSDATE赋值操作,这种开销通常非常小,对大多数应用性能影响可忽略不计。
  4. 业务逻辑分离: 触发器非常适合处理这种数据库层面的数据完整性和自动化任务。复杂的业务逻辑应尽量保留在应用程序层,以提高可维护性和可测试性。
  5. 审计日志: 类似的方法也可以用于实现更复杂的审计日志功能,记录每次操作的用户、时间、旧值和新值等。

总结

通过在Oracle数据库中创建BEFORE INSERT OR UPDATE触发器,我们可以高效且可靠地实现数据表列的SYSDATE自动更新。这种方法确保了时间戳的准确性,将时间戳管理逻辑从应用程序中解耦,并提供了数据库层面的数据一致性保证。对于需要精确控制和自动化时间戳记录的场景,数据库触发器无疑是首选的解决方案。

相关专题

更多
hibernate和mybatis有哪些区别
hibernate和mybatis有哪些区别

hibernate和mybatis的区别:1、实现方式;2、性能;3、对象管理的对比;4、缓存机制。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

136

2024.02.23

Hibernate框架介绍
Hibernate框架介绍

本专题整合了hibernate框架相关内容,阅读专题下面的文章了解更多详细内容。

76

2025.08.06

Java Hibernate框架
Java Hibernate框架

本专题聚焦 Java 主流 ORM 框架 Hibernate 的学习与应用,系统讲解对象关系映射、实体类与表映射、HQL 查询、事务管理、缓存机制与性能优化。通过电商平台、企业管理系统和博客项目等实战案例,帮助学员掌握 Hibernate 在持久层开发中的核心技能。

30

2025.09.02

Hibernate框架搭建
Hibernate框架搭建

本专题整合了Hibernate框架用法,阅读专题下面的文章了解更多详细内容。

64

2025.10.14

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

246

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

204

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1429

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

606

2023.11.24

ip地址修改教程大全
ip地址修改教程大全

本专题整合了ip地址修改教程大全,阅读下面的文章自行寻找合适的解决教程。

121

2025.12.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
SQL 教程
SQL 教程

共61课时 | 3.2万人学习

Java 教程
Java 教程

共578课时 | 39.1万人学习

oracle知识库
oracle知识库

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号