如何在SQL数据库引擎中实现数据库触发器?

时间:2012-02-23 23:30:30

标签: mysql sql database triggers

如何在SQL数据库引擎中实现触发器?我不是指SQL语言级别的触发器定义,而是指Oracle,SQL Server,MySQL等内部的底层实现。数据库引擎如何可扩展地管理数百或数千个触发器?他们是否使用发布 - 订阅模型,如观察者/侦听器模式?任何有关该主题的相关文献的指南也将受到赞赏。

我做谷歌的“数据库触发器实现”,但我找到的只是关于SQL触发器定义的信息,这也不是我想要的。

3 个答案:

答案 0 :(得分:3)

触发器是回调函数,因此实现可以像C中的函数指针一样简单。但是,通常不希望用户在C语言的RDBMS中编写用户定义的过程代码。您需要支持其他一些“更高级”的语言。所以相关的编程模式是DSL。触发器数量(可伸缩性)本身不是问题,因为每个表通常只有一个,最多两个,而DML事件只触发这些。实现挑战在其他地方:在一致性,并发语义方面。

答案 1 :(得分:1)

您可以浏览开源数据库的源代码。 例如PostreSql's trigger

答案 2 :(得分:1)

首先,触发器是在数据库中发生特定事件(例如,特定表上的INSERT / UPDATE / DELETE)时运行的代码片段。触发器在DML语句之前或之后隐式执行,并且触发器不能像存储过程那样显式执行。

还有两种类型的触发器 - STATEMENT LEVEL触发器和ROW LEVEL触发器。

在执行语句之前或之后触发STATEMENT LEVEL触发器。

在受操作影响的每一行上执行操作之前或之后,将触发ROW LEVEL触发器。

所以我们有12种类型的触发器:

 1. BEFORE INSERT STATEMENT
 2. BEFORE INSERT ROW
 3. AFTER INSERT STATEMENT
 4. AFTER INSERT ROW
 5. BEFORE UPDATE STATEMENT
 6. BEFORE UPDATE ROW
 7. AFTER UPDATE STATEMENT
 8. AFTER UPDATE ROW
 9. BEFORE DELETE STATEMENT
 10. BEFORE DELETE ROW
 11. AFTER DELETE STATEMENT
 12. AFTER DELETE ROW

可以为事件编码多个触发器,并提供其执行优先顺序。

每当我们在数据库上运行DML查询(INSERT / UPDATE / DELETE)时,该查询就会在事务中运行。因此,当查询运行时 -

  1. 表已锁定
  2. DBMS检查在执行语句之前运行的触发器
  3. 逐行执行实际的SQL语句。
  4. 寻找EACH ROW的BEFORE触发器。如果找到,执行。
  5. 检查错误。如果有,则回滚语句或其触发器所做的更改。
  6. 找到并执行任何每个行的触发器。
  7. 找到并执行任何AFTER STATEMENT触发器。
  8. 不同的DBMS管理事务的方式不同。有关详细信息,请参阅其文档。

    许多DBMS仅以文本格式保留触发器,而不像编译的存储过程。

    最佳做法是从触发器体内调用存储过程,因为存储过程的执行速度比触发器快得多。