mysql触发器Before和After的区别

2 02 3 年,朋友问我MySQL中BEFORE和AFTER触发器有什么区别。
我解释过 BEFORE 触发器可以在插入或更新数据之前修改数据,但 AFTER 触发器不能。
例如,BEFOREInsert 可以在将数据插入数据库之前修改新数据,但 AFTERInsert 则不能。
而且,它们都不能更改旧数据。

触发器就像一个警报,当数据库执行某个操作时,它会自动触发另一个操作。
触发器分为两种:BEFORE 和 AFTER,例如 BEFORE IN 和 AFTER IN。

在触发器中我们经常使用关键字NEW和OLD。
NEW 表示刚刚插入或更新的数据。
例如,在BEFOREInsert触发器中,NEW.username可以获取新插入的数据。
OLD在DELETE触发器中使用,表示要删除的数据。
例如,OLD.email可以检索要删除的数据。

对于INSERT语句,只能使用NEW;对于DELETE语句,只能使用OLD; UPDATE 语句可以使用 NEW 和 OLD。

朋友听后点点头,说:“哦,明白了,你在实际操作中怎么使用这些触发器呢?”
我笑了笑说:“这个需要多练习,我可以给你一些案例供你参考。

(我只是想到了另外一件事,触发器的实际应用有很多技巧,比如如何处理错误,现在如何开始优化等等)

MySQL数据不能被修改mysql不可以编辑

说白了,MySQL中防止数据修改的方法主要有三种:触发器、视图、权限限制。
这三个技巧都有自己的目标,如果使用得当,可以有效地保存关键数据。

首先使用触发器。
我们去年做的项目中大量使用了它们。
例如,创建一个“before_update”触发器。
当有人尝试修改某列数据时,直接触发“数据无法修改”错误信息。
请注意,该触发的条件必须写正确。
去年我差点犯了一个错误,因为我错过了 IF 语句。
想想那个场景我就头疼。
还有一点是必须考虑触发器对性能的影响。
当我们处理 3 000 QPS 左右时,非索引触发器直接使响应速度减慢了 3 0%。

还有另一个关键细节。
即使扳机起作用,如果使用太多,它也会变得像蜘蛛网一样混乱。
一开始我以为简单写几个就够了,后来发现错了。
如果太多人使用表,更改触发器比更改代码更耗时。
等等,还有一件事。
触发器中有一个隐藏的陷阱,那就是它们对于 SELECT 语句来说是无用的。
很多人不重视这一点。

我们来谈谈视图,它适合保护数据可视化层。
例如,创建一个只读视图“readonly_view”,并选择要保护的数据,形成虚拟表。
去年,我们有一个报告系统,它使用可视化来完全隔离底层数据。
但值得注意的是,愿景本身是可以重新定义的。
很多人不注意这一点。
用行话来说,这称为抽象隔离。
事实上,前面的一点点延迟就会导致后面的一切崩溃,所以视图的SQL不能太复杂。

最后还有一个授权限制,适合权限管理。
去年我们给审计部门分配了一个只读用户,直接使用GRANT SELECT来实现。
但有一个前提:SQL层面不能有漏洞。
例如,有人使用 EXPLAIN 来绕过它。
说实话,这确实是一个骗局。
去年我差点因为 JOIN 条件而被利用。

我认为这三种方法的结合值得尝试。
例如,使用可视化来隔离数据,然后使用触发器进行最终验证。
但请记住,任何安全措施都需要定期检查。
去年我们忘记更新触发器,导致数据在不知不觉中被更改。