`

【赵强老师】利用数据库触发器实现数据的同步

阅读更多

一、什么是触发器

数据库触发器是一个与表相关联的,存储的PL/SQL 语句。每当一个特定的数据操作语句(insert update delete)在指定的表上发出时,Oracle自动执行触发器中定义的语句序列。

触发器的应用场景如下:

  • 复杂的安全性检查
  • 数据的确认
  • 数据库审计
  • 数据的备份和审计

 

二、创建Oracle触发器的语法

CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER }
{INSERT | DELETE | UPDATE [OF column [, column …]]}
[OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]
ON [schema.]table_name | [schema.]view_name
[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
[FOR EACH ROW ]
[WHEN condition]
PL/SQL_BLOCK | CALL procedure_name;
其中:
  • BEFORE 和AFTER指出触发器的触发时序分别为前触发和后触发方式,前触发是在执行触发事件之前触发当前所创建的触发器,后触发是在执行触发事件之后触发当前所创建的触发器。
  • FOR EACH ROW选项说明触发器为行触发器。
  • 行触发器和语句触发器的区别表现在:行触发器要求当一个DML语句操走影响数据库中的多行数据时,对于其中的每个数据行,只要它们符合触发约束条件,均激活一次触发器;而语句触发器将整个语句操作作为触发事件,当它符合约束条件时,激活一次触发器。
  • 当省略FOR EACH ROW 选项时,BEFORE 和AFTER 触发器为语句触发器,而INSTEAD OF 触发器则只能为行触发器
  • REFERENCING 子句说明相关名称,在行触发器的PL/SQL块和WHEN 子句中可以使用相关名称参照当前的新、旧列值,默认的相关名称分别为OLD和NEW。触发器的PL/SQL块中应用相关名称时,必须在它们之前加冒号(:),但在WHEN子句中则不能加冒号。
  • WHEN 子句说明触发约束条件。Condition 为一个逻辑表达时,其中必须包含相关名称,而不能包含查询语句,也不能调用PL/SQL 函数。WHEN 子句指定的触发约束条件只能用在BEFORE 和AFTER 行触发器中,不能用在INSTEAD OF 行触发器和其它类型的触发器中。
  • 当一个基表被修改( INSERT, UPDATE, DELETE)时要执行的存储过程,执行时根据其所依附的基表改动而自动触发,因此与应用程序无关,用数据库触发器可以保证数据的一致性和完整性。

 

三、Oracle触发器的类型

  • 行级触发器:对DML语句影响的每个行执行一次,例如,一条update语句更新了100条数据,如果我们针对update定义了行级触发器,那么行级触发器将会被触发100次 。
  • 语句级触发器:对每个DML语句执行一次,例如,一条update语句更新了200条数据,如果我们针对update定义了语句级触发器,那么语句级触发器将会被触发1次 。

 

四、利用数据库触发器实现数据的同步

create or replace trigger sync_salary
after update
on emp
for each row
begin
  --当主表更新后,自动更新备份表。
  update emp_back set sal=:new.sal where empno=:new.empno;
end;
/
 
  • 在上面的例子中,当我们更新了主表emp的薪水后,这个行级触发器将会被自动执行更新备份表中的员工的薪水。

分享到:
评论

相关推荐

    传智播客 赵强 Oracle课件

    赵强老师在传智播客的Oracle课程是专为IT专业人士和对数据库技术感兴趣的学员设计的一系列教学资料,旨在深入浅出地讲解Oracle的核心概念、功能以及实际操作技巧。 在赵强老师的课程中,你可以学到以下几个重要的...

    从零开始oracle

    Oracle9i支持跨多个地理位置分布的数据存储和管理,可以实现数据的异地备份和恢复。 **图1.4 分布式网络数据库** - 上海、北京、长沙和重庆等地的数据中心通过网络连接起来,实现了数据的分布式存储。 #### ...

    Oracle数据库赵强视频教程【3天】

    教程名称:Oracle 数据库赵强视频教程【3天】教程目录:【】Oracle安装与管理、SQL语句(赵强)【】Orcale存储过程jdbc与Orcale大文本操作等(赵强)【】SQL简单查询触发器视图(赵强)  资源太大,传百度网盘了,链接在...

    赵强老师的Oracle课件

    想要好好地学习Oracle数据库的朋友呀,你错过了她就太不值得了。里面有好多的Oracle操作命令可能你都没接触过吧。好了,话不多多说。坚信资料不错!你,值得拥有!OK.还有,之所有要你2分打赏,是我给了你这么好的...

    oracle内部培训教材(来自传智播客学员)

    管理员可以控制用户对数据库资源的访问,实现数据的隔离和保护。 七、备份与恢复 Oracle提供了多种备份和恢复策略,如物理备份、逻辑备份、RMAN(恢复管理器)备份等。了解如何有效地备份和恢复数据库是数据库管理...

    精通JSP编程 作者赵强

    《精通JSP编程》是赵强先生的一部深入解析JSP技术的专业著作,该书针对JSP编程进行了全面且深入的讲解,旨在帮助读者掌握JSP的核心概念和技术,提升Web应用开发能力。根据提供的文件名列表,我们可以推测书籍的章节...

    Oracle学习笔记(传智播客 赵强)

    5. **多表查询与子查询的选择**:当两者都能实现需求时,尽量选择多表查询,因为它只需要对数据库进行一次操作,效率通常更高。 6. **处理NULL值**:在Oracle中,NULL表示无效、未指定或未知的值,它不等于空格或0...

    oracle讲义

    Oracle数据库管理系统是全球广泛使用的大型关系型数据库系统之一,它为各类企业和组织提供高效的数据存储和管理解决方案。本文将深入探讨"Oracle讲义"中涉及的关键知识点,包括Oracle的体系结构、文件管理、光标、...

    精通JSP编程 作者赵强 编

    精通JSP编程 作者赵强 编 12-18节

    10天掌握MongoDB

    综上所述,MongoDB作为一种现代的NoSQL数据库系统,其强大的功能和灵活的数据模型使其成为处理大规模、高并发数据场景的首选数据库之一。通过熟悉上述知识点,开发者能够更加高效地运用MongoDB进行应用程序开发,...

    [1120][赵强精通JSP编程][37M]

    根据提供的文件信息,我们可以推断出这是一份与Java Server Pages (JSP)相关的学习资料介绍,特别是关于赵强编写的《精通JSP编程》这本书的相关信息。下面将基于这个理解来生成相关知识点。 ### 一、JSP基础概念 ...

    oracle课件

    Oracle数据库系统是全球广泛使用的大型关系型数据库管理系统之一,它在企业级数据管理、数据分析以及应用程序开发中扮演着核心角色。本"Oracle课件"集合为初学者提供了一个丰富的学习平台,通过PPT格式深入浅出地...

    day2013-0110-webLogic配置和集群(赵强).zip

    2. JDBC数据源:配置和管理JDBC数据源,连接到数据库,提供统一的访问接口,支持数据源的连接池和事务管理。 3. SSL安全配置:为了保障通信安全,可以配置WebLogic支持SSL(Secure Sockets Layer),加密传输数据,...

    信息存储技术的发展赵强.doc

    这种增长趋势与数据量的爆炸性增长同步,推动存储技术不断创新,从原理到设备,再到系统的优化升级。 硬盘作为最重要的大容量存储设备,其发展速度惊人,密度提升了一百万倍,但仍面临着容量和速度的挑战。为了满足...

    java代码-46赖赵强 实训2编程实现一个5位八进制数012345,求出对应的十进制数。

    在Java编程语言中,将一个五位八进制数转换为对应的十进制数是一项基本的数字转换任务。八进制数系统使用8个符号...了解和掌握不同的数字系统转换是编程基础的重要部分,特别是在处理二进制、八进制和十六进制数据时。

    quantile-estimator:流数据的一些分位数算法实现

    分别在java / dotnet中实现。 代码是干净的。 易于阅读。 用法 Java dotnet 特征 线程安全 增值:无锁 批量获取分位数:已同步 时间窗 通过时间窗口旋转获得更好的精度 演算法 经典算法 准确的 没有数据压缩 ...

    java代码-46赖赵强实训2编程实现给出5个双精度浮点数(1.1,2.2,3.3,4.4,5.5),先求和,再求平均数。

    1. **数组基础**:数组是Java中用于存储同类型数据集合的数据结构。在这里,我们可以定义一个`double`类型的数组来保存五个双精度浮点数。数组声明如下: ```java double[] numbers = {1.1, 2.2, 3.3, 4.4, 5.5}; `...

    java代码-46赖赵强实训2编程实现给出一个3位整数(144),求它对55的余数是多少。

    以下是关于这个任务的详细知识点和实现步骤: 1. **模运算符 `%**:在Java中,模运算符 `%` 返回两个数相除后的余数。例如,`a % b` 的结果是 `a` 除以 `b` 后的余数。如果 `b` 是0,则会抛出`ArithmeticException`...

Global site tag (gtag.js) - Google Analytics