Be Very Careful When You Write SQL Trigger

一次实时数据链路丢数排查:从 MQTT 队列积压到 SQL 统计开销 本文通过一次实时数据链路压测,排查了从MQTT到ClickHouse的端到端数据丢失问题。核心方法是为每条消息添加序号,建立独立观察点(MQTT订阅端、Kafka消费者),结合转发服务阶段统计与线程栈分析,定位到下游处理速度不足源于Druid SQL合并统计的高开销。优化措施包括关闭SQL合并、扩容代理队列、增强生产侧失败处理,并验证15分钟内实现全链路对账一致,显著缓解积压与丢包。关键收获:数据可对账、明确各阶段“成功”定义、关注客户端队列状态。 阅读详情
In many scenarios, we write triggers on database tables. Before writing a trigger, we need to understand what trigger is and how exactly it works. Because, lack of clear knowledge on triggers can ake your life difficult. Trigger is actually a procedure that runs in response of an event fired due to performing some operations on database tables. The events could be insert, update or delete. Now, the question is how the database handles the execution of a trigger when it fires?
 
If you write a trigger for insert operation on a table, after firing the trigger, it creates a table named “ INSERTED” in the memory. Then it performs the insert operation and after that the statements inside the trigger executes. We can query the “ INSERTED” table to manipulate or use the inserted row/s from the trigger.
 
Similarly, if you write a trigger for delete operation on a table, it creates a table in memory named “ DELETED” and then deletes the row.
 
More importantly, you must understand how an update trigger works. After firing an update trigger, it works in the following sequence:
  1. All constraints are enforced.
  2. All declarative referential integrity (DRI) constraints are enforced (via foreign keys).
  3. The inserted and deleted tables are created in memory for use within the trigger.
  4. The triggering action (in this case the UPDATE statement) is executed.
  5. The AFTER UPDATE trigger executes.
 
From the above steps, you can see that no table called “ UPDATED” is created. Actually on database no operation called update executes. Internally it actually deletes the rows to be updated and keeps the deleted rows in DELETED table. The updated rows that are sent to update the table are kept in INSERTED TABLE. After the old rows are backed up to the DELETED table, updated rows from INSERTED tables get inserted into the targeted table.
 
So, from an update trigger, we can access both INSERTED</code and <code>DELETED table though directly we may not execute any insert or delete operation. This is a very important concept for us. Here I am providing the mistakes you may make if you are not clear on this.
 
Consider the following trigger:
 
CREATE TRIGGER TriggerName ON YourTableName
AFTER UPDATE ,INSERT , DELETE
AS
if(exists(select Contact_Id from inserted where Contact_id is not null))
begin
--Do your operation
end
if(exists(select Contact_Id from deleted where Contact_id is not null))
begin
--Do your operation
End
 


Here the developer wrote the trigger for all the events on the table and expecting to do some operation if Contact_ID is inserted, deleted or updated into the table.
 
Now note carefully the mistakes that the developer made in this trigger. For example, an operation is executed on the table which updates some other field other than Contact_ID. Now if Contact_ID is a not null column of the table, we will never get null from INSERTED and the DELETED table. So, here even though Contact_ID is not updated, the operation of the triggers will execute.
 
It is not finished yet. It has more problems. The developer wrote the 2nd if condition assuming that DELETED table will be created only when trigger fires for any Delete operation on the table. But you see, as a matter of fact, this table is also available when the trigger fires for update operation.
 
The situation will be the worst if the developer thinks the first if statement will be successful for INSERT and UPDATE operation and 2nd if statement will be successful for DELETE operation. Note that, in reality both 1st and 2nd if statements will be successful for update operations! So, if a developer wants some code to execute for all the operations, he might make the mistake of writing the same code in both 1st and 2nd if blocks. This will in turn execute the same operation twice while any update operation is done. Doesn’t it sound very silly and surprising? Yes. But if you are not careful, these mistakes can happen anytime and can take you to hell from the heaven you are currently in.
 
Another Mistake:
 
Say you are updating 5 rows of a table with a single update statement. Then, in trigger, you are querying as follows:
 
DECLARE @IsPublished [bit] 
SET @IsPublished = (SELECT [IsPublished] FROM [inserted])



 
Here, you are expecting 1 row in the INSERTED table all the time. You may think internally SQL Server creates separated INSERTED AND DELETED tables for each of the 5 rows. But no! In reality, it will create 1 INSERTED table and 1 DELETED table. Each of the tables will contain all the 5 rows. So, the above SQL statement will return an error. You should always be careful of this.
 
So, while writing a trigger, keep an eye on the following points:
 
  1. If you write a single trigger for multiple event, be very careful to ensure that your trigger does not execute for unwanted events.
  2. When writing update trigger, always check if your desired column is updated by using IF UPDATE(ColumnName).
  3. Be very careful in querying INSERTED and DELETED table.
  4. Try to avoid cursor from the trigger.
  5. Ensure that your trigger is not creating any deadlock/Infinite loop on your database.
Wish you write error free triggers and save hours of trouble shooting! 
Agent Memory 工程实践 :用 Go + PostgreSQL 构建可证明、可撤销的长期记忆 状态对外含义必需证据revoked删除事务已提交;新权威复核排除旧代主库 Epoch 与删除请求在线存储和派生载体完成清理每个 carrier 的 purge receipt备份、日志、导出和模型服务等已到期或完成适用清理保留策略与外部系统记录“24 小时”只能是经验证的产品目标,不能泛化成法律或物理擦除保证。API 应返回请求 ID、当前状态、已覆盖与未覆盖范围,而非一个含混的success。删除事件到达后,标记相关工作集失效。 阅读详情

相关推荐

大陆毫米波雷达ARS408-21xx实战:从零搭建ROS环境下的目标检测与可视化

本文详细介绍了大陆毫米波雷达ARS408-21xx在ROS环境下的实战部署全流程。从硬件连接、CAN总线配置,到ROS驱动节点开发、CAN报文解析,再到RViz三维可视化实现,提供了完整的代码示例与调试技巧,帮助开发者快速搭建毫米波雷达目标检测与可视化系统。

open4的博客 633

SQL并行执行的机制解析与计划调控实践

并行执行是大数据量场景的核心提速手段,但用错代价极高。本文从问题边界讲起,梳理并行度的确定层级、优化器生成并行计划的逻辑、数据再分布与通信代价、倾斜成因与识别方法,覆盖表设计、索引策略、并行DML、RAC调度与参数取舍,配合三个真实失败案例与诊断步骤,给出一套可落地的并行治理流程与误区清单。

搞定过:百亿级数据、万级QPS、零宕机、AI工业化。 629

用workbuddy自定义Skill:手把手搭建AI炒股分析助手

AI Agent正成为个人投资研究的重要工具,而Skill作为行为规范,能让AI输出保持稳定与专业。在AI Agent应用中,很多人分不清Skill与Agent的区别:Agent负责目标拆解与执行,Skill则固化分析流程与输出模板。借助本地工作台workbuddy,用户可自定义Skill,实现从市场环境检查到财务排雷的五段式分析。通过调低温度参数、设定数据验证规则,该方案能有效避免大模型凭空编造数据,帮助个人投资者快速完成基本面体检、资金面观察与风险清单生成。本文基于一套可直接套用的配置与一个月实测,展示

weixin_29038537的博客 515

Flink SQL 连接器实战:MySQL Source、Flink CDC 与 JDBC Sink 全解析

提供有界流读取,适合批处理和维表场景,简单直接但无法感知变更。MySQL CDC提供无界流读取,通过「全量快照 + binlog 增量」的方式实现实时捕获,是实时数仓的核心入口,但需要 MySQL 侧正确配置 binlog 和权限。JDBC Sink负责结果回写,关键在于区分仅插入流和更新流,更新流必须依赖主键完成 upsert。掌握这三者的差异,本质上就是掌握了 Flink 中「有界与无界」「追加与更新」这两组最基本的语义。

2401_83857914的博客 426

Python RK3588 MPP 8路视频硬解码!全体目光向我看齐!

本文重写了官方demo、加入了Zlmediakit进行拉流并通过pybind11将代码封装成so库,现在,在python中直接通过import的方式,就能完成基础的拉流解码操作,目前支持8路拉流解码!!!

m0_46303486的博客 4878

【Bug已解决】Context window exceeded / Token limit reached — Claude Code 上下文窗口超限解决方案

Claude Code 长会话中报上下文窗口/Token 超限,本质是对话历史、文件内容、工具结果累积超过 200K 上限。文中给出 /clear、/compact、分批读大文件、限制工具输出、配置 autoCompact 等完整方案。

一键难忘的博客 6727

云数仓向PostgreSQL生态延伸的技术动因与工程代价

Snowflake以2.5亿美元收购Crunchy Data,把云数仓的触角伸向PostgreSQL生态。本文从负载补齐、元数据标准化与AI应用低延迟读写三个切面拆解收购动机,逐层分析列存与行存的能力边界、存算分离下引入事务负载的提交延迟预算、逻辑复制的接缝风险、元数据统一与混合负载隔离冲突,并给出迁移落地的分阶段验收清单与七个典型误区,最后提供评估厂商PostgreSQL能力的六项观察指标。

搞定过:百亿级数据、万级QPS、零宕机、AI工业化。 411

工业预测性维护实战:振动分析+Transformer预警系统构建指南

摘要:本文聚焦工业设备预测性维护难题,提出基于振动分析与Transformer模型的全栈解决方案。通过低成本硬件选型(单传感器¥380)实现设备振动信号实时采集,利用边缘计算单元完成特征工程(RMS、峰度、峰值频率提取),并在云端部署Transformer时序模型进行异常预警。某风电龙头企业实践显示,系统将故障误报率从38%降至6%,维护成本降低58%,非计划停机时长减少87%。文中提供完整的边缘端特征提取代码、云端模型架构及实施流程,适配ISO 13373振动分析标准,为制造业设备健康管理提供可复用的工程

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 625

数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南

Oracle 提供了ORA_ROWSCN伪列(System Change Number),记录最后修改行的 SCN,类似 PostgreSQL 的xmin。实践中通常仍使用 version 字段方案,逻辑与 MySQL 完全相同。-- Oracle:通过 ORA_ROWSCN 实现乐观锁-- 更新时比对 SCN// 自定义注解// AOP 切面@Aspect@Component@Slf4jtry {

yjc_1111的专栏 397

Ubuntu开机进入initramfs,解决办法来了!

摘要:Ubuntu系统启动时卡在initramfs界面,表明系统无法正常挂载根文件系统。常见原因包括引导配置错误、文件系统损坏、驱动程序问题和硬件故障。解决方法包括:1)使用fsck修复文件系统;2)通过dmesg排查驱动问题;3)检查硬盘等硬件状态;4)重新安装GRUB引导程序。建议做好系统备份等预防措施,遇到问题时按步骤排查。该问题通常可通过文件系统修复或引导配置重建解决。(148字)

米可的博客! 3419

UE5 推荐的资产命名规范

在开发阶段中,随着 虚幻引擎(UE)(Unreal Engine (UE)) 项目日益复杂,内容浏览器(Content Browser) 中的 资产(Assets) 列表会不断扩充。这会导致资产出现各种变体版本,也会导致资产名称因过于相似而造成混淆。比如,你有一个文件夹名为"Soldier",这个文件夹中有蓝图、纹理和模型,它们的名称中都带"Soldier"一词,但在简单列表中,很难区别它们。

一碗清深的博客 3373

XSS 过滤器 vs SQL 注入防护:自动化测试平台中的

通过分析 AutoTest Platform 的源码可以看出,在实际开发中合理运用字符转义、参数化查询和白名单策略能够有效减少 Web 安全风险。对于非科班出身或刚刚入门的技术人员来说,理解这些安全措施的具体实现方式是非常重要的一步。建议读者可以尝试以下几个方向深入学习:1. 学习 Jsoup 库及 Whitelist API 的用法,并尝试自定义一套适用于自身项目的 HTML 清理规则;

后台模板 228

真格量化——GFTD策略

#!/usr/bin/env python # coding:utf-8 from PoboAPI import * import datetime import numpy as np import math #开始时间,用于初始化一些参数 def OnStart(context) : print "I\'m starting..." #设置全局变量 g.signalcount = 0 g.signal_list = [] g.buysignal = 0 .

qq_26742269的博客 1284

智能问数(Text2SQL)的两大方案及实施成本

现在流行挂个 RAG 知识库,把表结构、字段名、业务术语全向量化存起来,每次查询时现去检索相关片段喂给大模型。只做一件事,把口语化的自然语言转成有规则的自然语言,也就是“规范文本”。然后规则引擎根据预先配置好的业务词典和映射规则,把规范文本编译成 100% 准确的 SQL。核心工作量在配置业务词典,把用户爱说的“华北区”“在途订单”这些词,跟数据库表和字段对上。关键是,规则是写死的、确定的。SQL 怎么生成、逻辑怎么组合,全都写在规则里。出了问题,查规则、改词典、补映射,改完就知道对不对,没有不确定性。

Raqsoft 153

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

sqlsugar入门

sqlsugar入门

bjzhang75的博客 219

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

PostgreSQL 日报| pg_basebackup 提速至 23Gbps(11 月 5 日)

这一案例展示了按需、可弹性扩展的数据库供给如何满足 AI 辅助开发场景的需求,也说明 Neon 在多智能体与多用户并…Neon 的实际使用数据显示,AI agent 在选择工具时,即便内部逻辑建议使用 CLI,仍会优先选择 MCP server。然而,批评人士指出,该倡议同样服务于 OpenAI 自身的商业利益,意在将公司议程嵌入重大选举周期前的政治生态。用户可将其与平台上 70 余个其他模型配合使用,直接调用 Lakehouse 中的现有数据,构建受治理的 AI 应用与智能体。每个哈希条目存储两个有…

IvorySQL的博客 234

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

SonnetDB 5.0 正式发布:增强 SQL 与事务,开放九模型 MCP 读写

SonnetDB 5.0 正式发布,系统介绍相对 4.0 的 SQL、事务、精确类型、九模型 MCP、.NET 接入、查询优化、可靠性修复与升级步骤。

麦壳饼 356

4-1 PostgreSQL 索引体系总览:B-tree|GIN|GiST|BRIN|SP-GIST

很多新手拿到 PG 就无脑加 B-tree,遇到 JSONB、空间、时序数据直接踩坑。PG 不是只有 B-tree,5 种主流索引各司其职,**没有万能索引,匹配查询模式才是核心**。本文带你看懂每一类索引的原理、适用场景、优缺点、SQL 示例,最后重点讲清楚:索引不是越多越好。

zhangjw34的专栏 352

PostgreSQL 日报|子表 CHECK 约束恢复标记错误(11 月 2 日)

另外两个补丁 v5-0002 和 v5-0003 针对 PG18 中的同类问题,但涉及一个权衡:pg_dump 在恢复时可能将子表继承的 CHECK 约束的 pg_constraint.conislo…Rune 专注于 AI 驱动的物流解决方案,此次收购标志着 Salesforce 在国防领域的野心进一步扩大,也是其借助并购提升 AI 竞争力整体战略的重要一步。与此同时,市场对 AI 行业高额支出可持续性的担忧持续升温,资本压力与投资者的审慎情绪正为这家全球知名 AI 公司的前景蒙上阴影。

IvorySQL的博客 196

Day33 XD安全学习笔记--JavaEE应用&SQL 预编译&Filter过滤器&Listener监听器&访问控制

本文介绍了SQL预编译与Filter过滤器、Listener监听器的应用。SQL预编译有效防止注入攻击,相比拼接写法更安全。Filter用于拦截请求与响应,实现权限控制、敏感词过滤等功能,具备初始化、过滤、销毁生命周期;如XssFilter拦截非法参数,AdminFilter通过Cookie验证权限。Listener监听域对象的创建、销毁及属性变化,如Session的创建与销毁,实现系统状态管理。三者协同提升Web应用的安全性与可维护性。

一支蜉蝣的博客 220

SQL Pagination and Limiting Results using Oracle 21c

本文基于Oracle 21c在八域中台万亿级交易数据场景下,系统探讨分页与结果限制的优化实践。针对深翻页性能、OFFSET漂移、高并发一致性等痛点,对比分析OFFSET/FETCH与键集分页(keyset/seek)的适用性,提出分区裁剪、复合键锚点、UTC时区统一、多币种归一化处理等关键策略。结合自检验证,实现稳定、快速、用户友好的分页体验,为高并发、大容量国际业务系统提供可落地的技术方案。

Geovin Du Dream Park 301

PostgreSQL 日报|PG 19 发布公告草稿(11 月 8 日)

AgensGraph 2.18 基于 PostgreSQL 18.6 构建,在继续支持 openCypher 的同时,新增了对 ISO GQL 标准(ISO/IEC 39075)的扩展支持,引入了 LET、FOR、FILTER、NEXT、FINISH、INSERT 等子句以及图子查询功能。描述为"让用户向查询规划器提供自己的指导"并不准确,该扩展的设计初衷是计划稳定性,而非提示(hint)机制,应避免给人"给 Postgres 提示"的印象。在循环中途分配失败,该指针将指向一个部分初始化的对象。

IvorySQL的博客 182

SQL中的students是表名还是文本?关键字、标识符、常量与注释规则

表名加单引号为何变成文本?区分SQL中的标识符与常量,再看分号、引号和注释边界如何影响mysql客户端执行。 #MySQL #关键字 #标识符 #常量 #SQL注释 #SQL

tydldd的专栏 143

16-SqlSugar多库ConfigId与按实体选连接

通过 ConfigId 注册多库连接,结合实体特性标记库类型,实现按实体自动选择数据库。启动时扫描实体并警告未声明库的类型,运行时通过 GetConnectionScope 按逻辑名获取连接,确保连接生命周期与请求绑定。避免业务代码硬编码连接串,提升可维护性与安全性,但需注意跨库写操作无本地事务,应合理设计数据一致性策略。

CAthlete的博客 265

亲测丝滑,体验跃迁|AIIData通过集成开源项目SqlRest,SQL 一键变身可管控共享 API,开源能力再升级!

AllData 数据中台集成开源项目SqlRest构建API共享平台,将其作为数据服务对外输出的核心引擎。SqlRest 聚焦于把各类结构化数据快速转化为标准化 SQL API,支持灵活的 SQL 查询封装、参数化调用、结果格式适配,能够便捷对接多源底层数据源。

AllDataDC的博客 241

PG18 开发者与 SQL 新特性在 IvorySQL 5.6 实测

本文实测的这几族 SQL 新特性——uuidv7、虚拟生成列、加时段约束(PG18 新增),以及 PG17 就加了的 UUID 解析函数——在 IvorySQL 5.6 上全部原样可用,且都经过 5432/1521 双端口对照实测。时段约束是 PG 模式独有的 Oracle 模式支持要等下一个版本。

IvorySQL的博客 194
上一篇: 用javascript 验证两个输入框的开始时间和结束时间
下一篇: 获取客户端IP的SQL存储过程
xiaoding133
博客等级 码龄19年 415粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值