数据库中Triggers的作用已经用法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库中Triggers的作用已经用法相关的知识,希望对你有一定的参考价值。
高分求教:
在数据库中有一个Triggers,它是做什么用的,在数据库中起到什么作用,详细用法用途是什么?希望高手们能给出它的具体作用以及引用出处,感谢!
必须有SUPER权限才能查看该表。
TRIGGER_SCHEMA和TRIGGER_NAME列中分别含有相应数据库的名称以及触发程序的名称,在该数据库中,含有该触发程序。
mysql 5.1包含对触发程序的支持。触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。例如,下述语句将创建1个表和1个INSERT触发程序。触发程序将插入表中某一列的值加在一起:
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
-> FOR EACH ROW SET @sum = @sum + NEW.amount;
CREATE TRIGGER语法
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。
触发程序与命名为tbl_name的表相关。tbl_name必须引用永久性表。不能将触发程序与TEMPORARY表或视图关联起来。
trigger_time是触发程序的动作时间。它可以是BEFORE或AFTER,以指明触发程序是在激活它的语句之前或之后触发。
trigger_event指明了激活触发程序的语句的类型。trigger_event可以是下述值之一:
· INSERT:将新行插入表时激活触发程序,例如,通过INSERT、LOAD DATA和REPLACE语句。
· UPDATE:更改某一行时激活触发程序,例如,通过UPDATE语句。
· DELETE:从表中删除某一行时激活触发程序,例如,通过DELETE和REPLACE语句。
请注意,trigger_event与以表操作方式激活触发程序的SQL语句并不很类似,这点很重要。例如,关于INSERT的BEFORE触发程序不仅能被INSERT语句激活,也能被LOAD DATA语句激活。
可能会造成混淆的例子之一是INSERT INTO .. ON DUPLICATE UPDATE ...语法:BEFORE INSERT触发程序对于每一行将激活,后跟AFTER INSERT触发程序,或BEFORE UPDATE和AFTER UPDATE触发程序,具体情况取决于行上是否有重复键。
对于具有相同触发程序动作时间和事件的给定表,不能有两个触发程序。例如,对于某一表,不能有两个BEFORE UPDATE触发程序。但可以有1个BEFORE UPDATE触发程序和1个BEFORE INSERT触发程序,或1个BEFORE UPDATE触发程序和1个AFTER UPDATE触发程序。
DROP TRIGGER语法
DROP TRIGGER [schema_name.]trigger_name
舍弃触发程序。方案名称(schema_name)是可选的。如果省略了schema(方案),将从当前方案中舍弃触发程序。
参考资料:http://dev.mysql.com/doc/refman/5.1/zh/triggers.html
参考技术A Trigger,故名思义,触发器。简单点说,那个就是个数据库软件里的触发装置,用sql语句编写,作用有很多,比如,编写一个触发器,当对一个表进行delete或update的时候,触发,使得与其相关联的另一个表中的数据更新。。。
触发器的功能还有很多,用法也并不复杂,上网上随便一搜索,就能找到很多了。本回答被提问者采纳
Firebase 错误:TOO_MANY_TRIGGERS
【中文标题】Firebase 错误:TOO_MANY_TRIGGERS【英文标题】:Firebase error: TOO_MANY_TRIGGERS 【发布时间】:2018-11-12 12:39:18 【问题描述】:在我们的 Firebase 应用程序中,有一个列表,其中包含实时数据库中的大量项目。 Firebase Cloud Function 使用 onWrite 触发器处理单个项目的每个创建、更新和删除操作(在最简单的情况下,此函数只计算项目)。但有时需要对物品进行批量操作,而不需要单独处理。假设我们希望在单个事务中删除所有项目并重置计数器。
之前它工作得很好。由于单次写入 (https://firebase.google.com/docs/database/usage/limits) 触发的 Cloud Functions 数量限制为 1000,因此根本没有触发任何功能,这是理想的结果。
现在,我们没有对应用程序代码进行任何更改,但出现了错误
错误:TOO_MANY_TRIGGERS:此请求会导致触发太多函数。
客户端应用程序、管理 API 甚至使用 Web 界面导入 json 时也会出现同样的错误。唯一对我们有用的选项是批量处理项目。但它不是事务性的,最多需要几十分钟而不是以前的毫秒。
我们有哪些选项可以绕过这个错误?最好是在超过限制的情况下跳过功能触发的一些开关。
【问题讨论】:
我遇到了类似的问题。不幸的是,Firebase 有其局限性。 我分批删除了1000多条记录,每批只删除500条记录。 【参考方案1】:目前没有办法阻止触发器在特殊情况下运行。解决此问题的唯一方法是取消部署所有触发器,执行更新,然后再次部署所有触发器。
为此,我鼓励您file a feature request。
【讨论】:
不幸的是,取消部署和部署触发器不适用于我们的案例,因为在此过程中可能会留下未处理的新数据。 我明白了。这是您目前唯一的选择。 @DougStevenson 为什么删除具有超过 1000 个子节点的单个节点被视为多个触发器?我们只删除一个节点,不应该只是一个触发器吗? 如果您有一个带有 .write 操作触发器的云函数,也会调用太多触发器。如果您只使用 .update(例如在导入新数据时),这可能是一种解决方法。但我同意,棘手【参考方案2】:对于 2018 年后阅读此问题的任何人,现在可以选择禁用对触发限制的严格执行。
对于触发事件的写入操作,默认启用严格验证。任何触发超过 1000 个 Cloud Functions 或单个事件大小超过 1 MB 的写入操作都将失败并返回一个错误,报告已达到的限制。这可能意味着如果预验证失败,某些 Cloud Functions 根本不会被触发。
如果您正在执行更大的写入操作(例如,删除整个数据库),您可能希望禁用此验证,因为错误本身可能会阻止操作。
要关闭 strictTriggerValidation,请按以下步骤操作:
从 Firebase 控制台中项目设置的服务帐户选项卡获取您的数据库密钥。 从命令行运行以下 CURL 请求:curl -X PUT -d "false" https://NAMESPACE.firebaseio.com/.settings/strictTriggerValidation/.json?auth\=SECRET
请参阅此处查看文档:https://firebase.google.com/docs/database/usage/limits
【讨论】:
这非常有用,谢谢。应该设置为正确答案。【参考方案3】:我刚刚在很久没有接触过的较旧的 Flutter 项目中收到此错误消息。
[firebase_database/unknown] TOO_MANY_TRIGGERS:这个请求会导致太多的函数被 触发。
原来,这是因为我的 Cloud Functions 仍然设置为使用 Node v8,它已于 2021 年初退役。
升级 Cloud Functions 以使用 Node v12(无需其他更改)为我删除了错误消息。
【讨论】:
以上是关于数据库中Triggers的作用已经用法的主要内容,如果未能解决你的问题,请参考以下文章
information_schema.triggers 学习
redbean php 是不是考虑创建 mysql-triggers?