热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

不用触发器的理由

TOM说过他希望三样东西不曾存在:触发器,自治事务,WHENOTHERS。现在开发用的触发器都是表上的,FORM上的触发器是另一种东西,该用就用。每个触发器都是一个

      TOM说过他希望三样东西不曾存在:触发器,自治事务,WHEN OTHERS。

      现在开发用的触发器都是表上的,FORM上的触发器是另一种东西,该用就用。每个触发器都是一个隐藏的存储过程。隐藏的代码对开发者很不友好。如果你正在看一段别人的程序,总觉得少了点什么,折腾半天原来还有些动作隐藏在触发器里!顺藤摸瓜去找了触发器,发现里面对其他表有DML,又有其他隐藏代码,是不是头很大?这种连锁触发增加了复杂性,很容易失控。起初我也做过这种东西,觉得系统布满了精巧的机关,很有成就感,后来才发现这对维护来说简直就是噩梦加陷阱。

       因为触发器是隐藏的,它不执行你也不知道。假如有个触发器编译失效,DML还是不声不响的照样成功了!存储过程就不会这样。触发器没有办法绕过。假如你有个产品正在跑,这时候需要补几条故障时间的历史数据,INSERT上的触发器有些动作是你不想要的,这就难办了。

       触发器还有MUTATING TABLE问题。很多人一看这问题就上自治事务,殊不知这是个馊主意。自治事务使得你看到的数据都是旧的,因为主事务所作的修改还未提交。多行的DML会多次触发,产生一大堆小事务,很容易发生死锁。 在批量操作、多次触发到情况下,触发器的效率低,因为它相当于每次都执行一段PL/SQL. 往往可以把它转化为等价的几个SQL,效率提高很多。

        触发器是低效的,当做大数据量修改的时候,每行触发一次触发器,性能将非常之差。

        级联删除、级联修改,在设计良好的系统中是不存在的。即使有,那也是小概率事件,必须专门写一段脚本来解决,而不是作为常规功能存在。

        非要说触发器适用于哪种场景:当Oracle提供表字段的校验规则不够用(非空、唯一),需要一个非常复杂的校验规则时。


推荐阅读
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 本文详细探讨了不同SQL数据库管理系统(DBMS)在限制输出结果、拼接字段和日期时间处理方面的函数差异。通过具体示例,帮助读者理解并掌握如何在不同DBMS中实现相同功能。 ... [详细]
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • 使用C#开发SQL Server存储过程的指南
    本文介绍如何利用C#在SQL Server中创建存储过程,涵盖背景、步骤和应用场景,旨在帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 本文详细介绍了如何通过多种编程语言(如PHP、JSP)实现网站与MySQL数据库的连接,包括创建数据库、表的基本操作,以及数据的读取和写入方法。 ... [详细]
  • 利用存储过程构建年度日历表的详细指南
    本文将介绍如何使用SQL存储过程创建一个完整的年度日历表。通过实例演示,帮助读者掌握存储过程的应用技巧,并提供详细的代码解析和执行步骤。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本文介绍如何通过创建替代插入触发器,使对视图的插入操作能够正确更新相关的基本表。涉及的表包括:飞机(Aircraft)、员工(Employee)和认证(Certification)。 ... [详细]
  • 本文深入探讨了 Java 编程语言的基础,特别是其跨平台特性和 JVM 的工作原理。通过介绍 Java 的发展历史和生态系统,帮助初学者理解如何编写并运行第一个 Java 程序。 ... [详细]
  • 本文详细介绍了 MySQL 中 LAST_INSERT_ID() 函数的使用方法及其工作原理,包括如何获取最后一个插入记录的自增 ID、多行插入时的行为以及在不同客户端环境下的表现。 ... [详细]
author-avatar
铁合金在线
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有