【问题标题】:How a trigger on a table works on insert event?表上的触发器如何处理插入事件?
【发布时间】:2014-11-09 19:34:18
【问题描述】:

假设,我将开发一个触发器,当插入表 A 时,将记录插入表 A。

因此,我想知道系统如何处理这种漏洞,或者它将继续循环直到系统挂起,这需要重新启动并可能删除数据库。

我正在尝试收集有关此问题或漏洞的几乎所有 DBMS 的信息。

【问题讨论】:

  • 那么... mysql 还是 oracle?不能两者兼得。
  • 我使用这两个标签来吸引更多人看到这个。如果我让您感到困惑或给您带来任何麻烦,我很抱歉。 @Aquillo
  • 这里的问题是您引用了两个不同的 DBMS,它们可能以不同的方式响应。为了让人们帮助您,了解您正在使用哪个 DBMS 非常重要。
  • 啊,其实是随机的。我没有要搜索的特定 DBMS。我正在尝试收集有关任何数据库的信息。如果您是其中任何一个专家,欢迎您发表评论。我只是想找到数据库安全性..>!

标签: mysql sql oracle triggers


【解决方案1】:

我只能和Oracle说话,我对MySQL一无所知。

在 Oracle 中,这种情况称为突变。 Oracle 不会陷入死循环。它将检测条件,并引发 ORA-04091 错误。

即:

ORA-04091: table XXXX is mutating, trigger/function may not see it

标准的解决方案是定义一个包含三个函数和一个包级数组的包。三个函数如下:

  1. 初始化 - 这只会将数组清零。
  2. save_row - 这会将当前行的 id(uk 或 pk)保存到数组中。
  3. process_rows - 这将通过数组,并实际为每一行执行触发操作。

现在,定义一些触发动作:

之前的语句级别:调用初始化
之前或之后的行级别:调用 save_row
之后的语句级别:调用 process_rows

这样,Oracle 可以避免突变,你的触发器就会起作用。

更多细节和一些示例代码可以在这里找到: https://asktom.oracle.com/pls/asktom/ASKTOM.download_file?p_file=6551198119097816936

【讨论】:

  • 谢谢。很有用……!
  • 嗨,马克。 Stack Overflow 上首选技术写作风格。鉴于没有作者发布希望它没有帮助的答案,“希望它有帮助”这句话是相当多余的。我有时想知道是否下意识地投票恳求。无论如何,编辑会倾向于删除这些,而我们没有足够的编辑来处理工作量。如果您能对这些志愿者有所怜悯,并坚持简洁,他们将不胜感激!
【解决方案2】:

如果您使用而不是触发器,则只能在同一个表中插入一条记录。在所有其他情况下,您只能修改正在插入的记录。

我希望这能回答你的问题。

【讨论】:

  • 我有点明白,但这不是我想要的答案!如果为 For Insert 执行了这个触发器,会发生什么?
  • @gayan1991 如果您正在编写触发器“For Insert”,您只能在同一个表中插入一条记录。此插入不会再次触发触发器。这是当前版本的标准数据库遵循的基本规则。
  • 它依赖于 DBMS 吗?我认为,尤其是在旧的 DBMS 中,这种突变问题没有得到处理,例如 Microsoft Windows Server 2005。因此,我想知道在哪个提供此解决方案的情况下,您是否尝试过? Oracle DBMS 在触发器创建时停止了这种麻烦的事情。
  • 同意,旧版本的 DBMS 系统存在变异问题,随后在后续版本中得到了纠正。
【解决方案3】:

您可以在 mysql DBMS 中创建触发器。 检查下面的链接以创建插入触发器语法

http://www.techonthenet.com/oracle/triggers/after_insert.php

【讨论】:

  • 好吧!!!。假设,您为表 A 创建了一个触发器以将记录插入到表 A 中,并且每当进行插入时都会触发此触发器。然后你在表 A 中插入一条记录。你能告诉我接下来会发生什么吗?
  • 在表 A 中插入记录后,在表 A 中再次插入相同的值。
  • 第一次插入是由用户进行的。第二次插入是由触发器。做第二条记录的时候,是不是又要执行触发器了?
  • 当您在定义了 INSERT 事件的触发器的动作中使用 INSERT 时,触发器可能会陷入无限循环。
  • 啊,是的。我可以知道你是什么数据库专家吗?你有没有尝试过或陷入过这样的情况?
猜你喜欢
  • 2016-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-09
  • 2013-11-23
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
相关资源
最近更新 更多