相关代码:
1. org.h2.command.Parser.parseCreateTrigger(boolean)
负责解析触发器的SQL语法
2. org.h2.command.ddl.CreateTrigger
解析触发器的SQL语法时得到的数据放在CreateTrigger对象中,
调用org.h2.command.ddl.CreateTrigger.update()会生成内部的org.h2.schema.TriggerObject实例,
并把此TriggerObject实例的一些信息放到Database的Meta表、Schema对象、Table对象。
3. org.h2.schema.TriggerObject
内含org.h2.api.Trigger接口的实现类的实例,以及CreateTrigger对象传进来的一些参数,
当进行CRUD操作时会触发:
org.h2.schema.TriggerObject.fire(Session, int, boolean)
此方法对不加FOR EACH ROW的触发器有效
org.h2.schema.TriggerObject.fireRow(Session, Row, Row, boolean, boolean)
此方法只对加FOR EACH ROW的触发器有效
4. org.h2.table.Table类中的一些fire方法
org.h2.table.Table.fire(Session, int, boolean)
此方法对不加FOR EACH ROW的触发器有效
因为一条insert sql可以增加多行记录,此方法相当于应用于整个insert sql的,
而下面三个方法应用于insert sql中的每行记录,
具体见org.h2.command.dml.Insert.insertRows()
在org.h2.command.dml.Insert.insertRows()的前后调用fire,
而在org.h2.command.dml.Insert.insertRows()内部的for循环中调用下面三个方法中的前两个
org.h2.table.Table.fireRow()只用于delete和update
org.h2.table.Table.fireBeforeRow(Session, Row, Row)
org.h2.table.Table.fireAfterRow(Session, Row, Row, boolean)
org.h2.table.Table.fireRow()
这三个方法只对加FOR EACH ROW的触发器有效