You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ro...@apache.org on 2022/04/19 01:41:10 UTC

[iotdb] branch master updated: [IOTDB-2588] Triggers support any tree level, such as storage groups, devices, measurements, and so on (#5495)

This is an automated email from the ASF dual-hosted git repository.

rong pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 3cc7eb2519 [IOTDB-2588] Triggers support any tree level, such as storage groups, devices, measurements, and so on (#5495)
3cc7eb2519 is described below

commit 3cc7eb2519123ad42a04596c4f8c556ca1625ca3
Author: gongning <is...@gmail.com>
AuthorDate: Tue Apr 19 09:41:04 2022 +0800

    [IOTDB-2588] Triggers support any tree level, such as storage groups, devices, measurements, and so on (#5495)
    
    Co-authored-by: wenhua.gongwh <we...@alibaba-inc.com>
    Co-authored-by: Steve Yurong Su <ro...@apache.org>
---
 .../db/integration/IoTDBTriggerExecutionIT.java    | 188 ++++++++++++++-------
 .../db/engine/trigger/executor/TriggerEngine.java  |  20 ++-
 .../engine/trigger/executor/TriggerExecutor.java   |  29 ++--
 .../service/TriggerRegistrationService.java        |  52 +++---
 .../iotdb/db/metadata/LocalSchemaProcessor.java    |  11 +-
 .../idtable/entry/InsertMeasurementMNode.java      |  20 +++
 .../org/apache/iotdb/db/metadata/mnode/IMNode.java |   8 +
 .../org/apache/iotdb/db/metadata/mnode/MNode.java  |  29 ++++
 .../iotdb/db/metadata/mnode/MeasurementMNode.java  |   2 -
 .../mnode/estimator/BasicMNodSizeEstimator.java    |   6 +-
 .../db/metadata/schemaregion/ISchemaRegion.java    |   5 +-
 .../db/metadata/schemaregion/SchemaRegion.java     |  11 +-
 .../schemaregion/rocksdb/RSchemaRegion.java        |   6 +-
 .../schemaregion/rocksdb/mnode/RMNode.java         |  20 +++
 14 files changed, 277 insertions(+), 130 deletions(-)

diff --git a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBTriggerExecutionIT.java b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBTriggerExecutionIT.java
index 695af46494..c57d35fd75 100644
--- a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBTriggerExecutionIT.java
+++ b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBTriggerExecutionIT.java
@@ -73,7 +73,7 @@ public class IoTDBTriggerExecutionIT {
               ++count;
               statement.execute(
                   String.format(
-                      "insert into root.vehicle.d1(timestamp,s1,s2,s3,s4,s5,s6) values(%d,%d,%d,%d,%d,%s,'%d')",
+                      "insert into root.vehicle.a.b.c.d1(timestamp,s1,s2,s3,s4,s5,s6) values(%d,%d,%d,%d,%d,%s,'%d')",
                       count, count, count, count, count, count % 2 == 0 ? "true" : "false", count));
             } while (!isInterrupted());
           } catch (Exception e) {
@@ -102,37 +102,37 @@ public class IoTDBTriggerExecutionIT {
 
   private void createTimeseries() throws MetadataException {
     IoTDB.schemaProcessor.createTimeseries(
-        new PartialPath("root.vehicle.d1.s1"),
+        new PartialPath("root.vehicle.a.b.c.d1.s1"),
         TSDataType.INT32,
         TSEncoding.PLAIN,
         CompressionType.UNCOMPRESSED,
         null);
     IoTDB.schemaProcessor.createTimeseries(
-        new PartialPath("root.vehicle.d1.s2"),
+        new PartialPath("root.vehicle.a.b.c.d1.s2"),
         TSDataType.INT64,
         TSEncoding.PLAIN,
         CompressionType.UNCOMPRESSED,
         null);
     IoTDB.schemaProcessor.createTimeseries(
-        new PartialPath("root.vehicle.d1.s3"),
+        new PartialPath("root.vehicle.a.b.c.d1.s3"),
         TSDataType.FLOAT,
         TSEncoding.PLAIN,
         CompressionType.UNCOMPRESSED,
         null);
     IoTDB.schemaProcessor.createTimeseries(
-        new PartialPath("root.vehicle.d1.s4"),
+        new PartialPath("root.vehicle.a.b.c.d1.s4"),
         TSDataType.DOUBLE,
         TSEncoding.PLAIN,
         CompressionType.UNCOMPRESSED,
         null);
     IoTDB.schemaProcessor.createTimeseries(
-        new PartialPath("root.vehicle.d1.s5"),
+        new PartialPath("root.vehicle.a.b.c.d1.s5"),
         TSDataType.BOOLEAN,
         TSEncoding.PLAIN,
         CompressionType.UNCOMPRESSED,
         null);
     IoTDB.schemaProcessor.createTimeseries(
-        new PartialPath("root.vehicle.d1.s6"),
+        new PartialPath("root.vehicle.a.b.c.d1.s6"),
         TSDataType.TEXT,
         TSEncoding.PLAIN,
         CompressionType.UNCOMPRESSED,
@@ -158,17 +158,17 @@ public class IoTDBTriggerExecutionIT {
                 Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
         Statement statement = connection.createStatement()) {
       statement.execute(
-          "create trigger trigger_1 before insert on root.vehicle.d1.s1 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_1 before insert on root.vehicle.a.b.c.d1.s1 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_2 after insert on root.vehicle.d1.s2 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_2 after insert on root.vehicle.a.b.c.d1.s2 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_3 before insert on root.vehicle.d1.s3 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_3 before insert on root.vehicle.a.b.c.d1.s3 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_4 after insert on root.vehicle.d1.s4 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_4 after insert on root.vehicle.a.b.c.d1.s4 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_5 before insert on root.vehicle.d1.s5 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_5 before insert on root.vehicle.a.b.c.d1.s5 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_6 after insert on root.vehicle.d1.s6 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_6 after insert on root.vehicle.a.b.c.d1.s6 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
 
       int[] counters1 = getCounters(6);
       LOGGER.info(Arrays.toString(counters1));
@@ -209,11 +209,11 @@ public class IoTDBTriggerExecutionIT {
       waitCountIncreaseBy(500);
 
       statement.execute(
-          "create trigger trigger_1 before insert on root.vehicle.d1.s1 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_1 before insert on root.vehicle.a.b.c.d1.s1 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_2 after insert on root.vehicle.d1.s2 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_2 after insert on root.vehicle.a.b.c.d1.s2 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_3 before insert on root.vehicle.d1.s3 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_3 before insert on root.vehicle.a.b.c.d1.s3 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
 
       waitCountIncreaseBy(500);
 
@@ -230,11 +230,11 @@ public class IoTDBTriggerExecutionIT {
       waitCountIncreaseBy(500);
 
       statement.execute(
-          "create trigger trigger_4 after insert on root.vehicle.d1.s4 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_4 after insert on root.vehicle.a.b.c.d1.s4 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_5 before insert on root.vehicle.d1.s5 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_5 before insert on root.vehicle.a.b.c.d1.s5 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_6 after insert on root.vehicle.d1.s6 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_6 after insert on root.vehicle.a.b.c.d1.s6 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
 
       // IOTDB-1825: if the background data generator's connection is closed, the following checks
       // will be meaningless, in which case we ignore the checks
@@ -264,11 +264,11 @@ public class IoTDBTriggerExecutionIT {
       waitCountIncreaseBy(500);
 
       statement.execute(
-          "create trigger trigger_1 before insert on root.vehicle.d1.s1 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_1 before insert on root.vehicle.a.b.c.d1.s1 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_2 after insert on root.vehicle.d1.s2 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_2 after insert on root.vehicle.a.b.c.d1.s2 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_3 before insert on root.vehicle.d1.s3 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_3 before insert on root.vehicle.a.b.c.d1.s3 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
 
       waitCountIncreaseBy(500);
 
@@ -289,22 +289,22 @@ public class IoTDBTriggerExecutionIT {
       statement.execute("drop trigger trigger_3");
       waitCountIncreaseBy(100);
       statement.execute(
-          "create trigger trigger_1 before insert on root.vehicle.d1.s1 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_1 before insert on root.vehicle.a.b.c.d1.s1 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_2 after insert on root.vehicle.d1.s2 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_2 after insert on root.vehicle.a.b.c.d1.s2 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_3 before insert on root.vehicle.d1.s3 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_3 before insert on root.vehicle.a.b.c.d1.s3 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       waitCountIncreaseBy(100);
       statement.execute("drop trigger trigger_1");
       statement.execute("drop trigger trigger_2");
       statement.execute("drop trigger trigger_3");
       waitCountIncreaseBy(100);
       statement.execute(
-          "create trigger trigger_1 before insert on root.vehicle.d1.s1 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_1 before insert on root.vehicle.a.b.c.d1.s1 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_2 after insert on root.vehicle.d1.s2 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_2 after insert on root.vehicle.a.b.c.d1.s2 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_3 before insert on root.vehicle.d1.s3 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_3 before insert on root.vehicle.a.b.c.d1.s3 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
 
       waitCountIncreaseBy(500);
 
@@ -336,17 +336,17 @@ public class IoTDBTriggerExecutionIT {
       waitCountIncreaseBy(500);
 
       statement.execute(
-          "create trigger trigger_1 before insert on root.vehicle.d1.s1 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_1 before insert on root.vehicle.a.b.c.d1.s1 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_2 after insert on root.vehicle.d1.s2 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_2 after insert on root.vehicle.a.b.c.d1.s2 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_3 before insert on root.vehicle.d1.s3 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_3 before insert on root.vehicle.a.b.c.d1.s3 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_4 after insert on root.vehicle.d1.s4 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_4 after insert on root.vehicle.a.b.c.d1.s4 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_5 before insert on root.vehicle.d1.s5 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_5 before insert on root.vehicle.a.b.c.d1.s5 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_6 after insert on root.vehicle.d1.s6 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_6 after insert on root.vehicle.a.b.c.d1.s6 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
 
       waitCountIncreaseBy(500);
 
@@ -460,17 +460,17 @@ public class IoTDBTriggerExecutionIT {
       waitCountIncreaseBy(500);
 
       statement.execute(
-          "create trigger trigger_1 before insert on root.vehicle.d1.s1 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_1 before insert on root.vehicle.a.b.c.d1.s1 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_2 after insert on root.vehicle.d1.s2 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_2 after insert on root.vehicle.a.b.c.d1.s2 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_3 before insert on root.vehicle.d1.s3 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_3 before insert on root.vehicle.a.b.c.d1.s3 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_4 after insert on root.vehicle.d1.s4 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_4 after insert on root.vehicle.a.b.c.d1.s4 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_5 before insert on root.vehicle.d1.s5 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_5 before insert on root.vehicle.a.b.c.d1.s5 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_6 after insert on root.vehicle.d1.s6 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_6 after insert on root.vehicle.a.b.c.d1.s6 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
 
       waitCountIncreaseBy(500);
 
@@ -487,12 +487,12 @@ public class IoTDBTriggerExecutionIT {
 
       stopDataGenerator();
 
-      IoTDB.schemaProcessor.deleteTimeseries(new PartialPath("root.vehicle.d1.s1"));
-      IoTDB.schemaProcessor.deleteTimeseries(new PartialPath("root.vehicle.d1.s2"));
-      IoTDB.schemaProcessor.deleteTimeseries(new PartialPath("root.vehicle.d1.s3"));
-      IoTDB.schemaProcessor.deleteTimeseries(new PartialPath("root.vehicle.d1.s4"));
-      IoTDB.schemaProcessor.deleteTimeseries(new PartialPath("root.vehicle.d1.s5"));
-      IoTDB.schemaProcessor.deleteTimeseries(new PartialPath("root.vehicle.d1.s6"));
+      IoTDB.schemaProcessor.deleteTimeseries(new PartialPath("root.vehicle.a.b.c.d1.s1"));
+      IoTDB.schemaProcessor.deleteTimeseries(new PartialPath("root.vehicle.a.b.c.d1.s2"));
+      IoTDB.schemaProcessor.deleteTimeseries(new PartialPath("root.vehicle.a.b.c.d1.s3"));
+      IoTDB.schemaProcessor.deleteTimeseries(new PartialPath("root.vehicle.a.b.c.d1.s4"));
+      IoTDB.schemaProcessor.deleteTimeseries(new PartialPath("root.vehicle.a.b.c.d1.s5"));
+      IoTDB.schemaProcessor.deleteTimeseries(new PartialPath("root.vehicle.a.b.c.d1.s6"));
 
       for (int i = 0; i < 6; ++i) {
         try {
@@ -515,17 +515,17 @@ public class IoTDBTriggerExecutionIT {
       }
 
       statement.execute(
-          "create trigger trigger_1 before insert on root.vehicle.d1.s1 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_1 before insert on root.vehicle.a.b.c.d1.s1 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_2 after insert on root.vehicle.d1.s2 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_2 after insert on root.vehicle.a.b.c.d1.s2 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_3 before insert on root.vehicle.d1.s3 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_3 before insert on root.vehicle.a.b.c.d1.s3 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_4 after insert on root.vehicle.d1.s4 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_4 after insert on root.vehicle.a.b.c.d1.s4 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_5 before insert on root.vehicle.d1.s5 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_5 before insert on root.vehicle.a.b.c.d1.s5 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_6 after insert on root.vehicle.d1.s6 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_6 after insert on root.vehicle.a.b.c.d1.s6 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
 
       Thread.sleep(500);
 
@@ -550,17 +550,17 @@ public class IoTDBTriggerExecutionIT {
                 Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
         Statement statement = connection.createStatement()) {
       statement.execute(
-          "create trigger trigger_1 before insert on root.vehicle.d1.s1 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_1 before insert on root.vehicle.a.b.c.d1.s1 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_2 after insert on root.vehicle.d1.s2 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_2 after insert on root.vehicle.a.b.c.d1.s2 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_3 before insert on root.vehicle.d1.s3 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_3 before insert on root.vehicle.a.b.c.d1.s3 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_4 after insert on root.vehicle.d1.s4 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_4 after insert on root.vehicle.a.b.c.d1.s4 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_5 before insert on root.vehicle.d1.s5 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_5 before insert on root.vehicle.a.b.c.d1.s5 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_6 after insert on root.vehicle.d1.s6 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_6 after insert on root.vehicle.a.b.c.d1.s6 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
 
       waitCountIncreaseBy(500);
 
@@ -590,17 +590,17 @@ public class IoTDBTriggerExecutionIT {
       }
 
       statement.execute(
-          "create trigger trigger_1 before insert on root.vehicle.d1.s1 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_1 before insert on root.vehicle.a.b.c.d1.s1 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_2 after insert on root.vehicle.d1.s2 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_2 after insert on root.vehicle.a.b.c.d1.s2 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_3 before insert on root.vehicle.d1.s3 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_3 before insert on root.vehicle.a.b.c.d1.s3 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_4 after insert on root.vehicle.d1.s4 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_4 after insert on root.vehicle.a.b.c.d1.s4 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_5 before insert on root.vehicle.d1.s5 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_5 before insert on root.vehicle.a.b.c.d1.s5 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
       statement.execute(
-          "create trigger trigger_6 after insert on root.vehicle.d1.s6 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+          "create trigger trigger_6 after insert on root.vehicle.a.b.c.d1.s6 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
 
       Thread.sleep(500);
 
@@ -615,4 +615,64 @@ public class IoTDBTriggerExecutionIT {
       stopDataGenerator();
     }
   }
+
+  @Test
+  public void testCreateMultipleLevelTriggersMultipleTimesWhileInserting()
+      throws InterruptedException {
+
+    try (Connection connection =
+            DriverManager.getConnection(
+                Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
+        Statement statement = connection.createStatement()) {
+      statement.execute(
+          "create trigger trigger_1 before insert on root.vehicle.a.b.c.d1.s1 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+      statement.execute(
+          "create trigger trigger_2 before insert on root.vehicle.a.b.c.d1.s2 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+      statement.execute(
+          "create trigger trigger_3 before insert on root.vehicle.a.b.c.d1.s3 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+      statement.execute(
+          "create trigger trigger_4 before insert on root.vehicle.a.b.c.d1.s4 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+      statement.execute(
+          "create trigger trigger_5 before insert on root.vehicle.a.b.c.d1.s5 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+      statement.execute(
+          "create trigger trigger_6 before insert on root.vehicle.a.b.c.d1.s6 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+
+      statement.execute(
+          "create trigger trigger_7 before insert on root.vehicle.a.b.c.d1 as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+      statement.execute(
+          "create trigger trigger_8 before insert on root.vehicle.a.b.c as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+      statement.execute(
+          "create trigger trigger_9 after insert on root.vehicle.a.b as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+      statement.execute(
+          "create trigger trigger_10 before insert on root.vehicle.a as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+      statement.execute(
+          "create trigger trigger_11 after insert on root.vehicle as 'org.apache.iotdb.db.engine.trigger.example.Counter'");
+
+      startDataGenerator();
+      waitCountIncreaseBy(500);
+      stopDataGenerator();
+      int[] counters = getCounters(11);
+      assertEquals(counters[0], counters[1]);
+      assertEquals(counters[3], counters[4]);
+      int sumCount =
+          counters[0]
+              + counters[1]
+              + counters[2]
+              + counters[3]
+              + counters[4]
+              + counters[5]
+              - 6 * Counter.BASE;
+      assertEquals(sumCount, (counters[6] - Counter.BASE));
+      assertEquals(sumCount, (counters[7] - Counter.BASE));
+      assertEquals(sumCount, (counters[8] - Counter.BASE));
+      assertEquals(sumCount, (counters[9] - Counter.BASE));
+      assertEquals(sumCount, (counters[10] - Counter.BASE));
+      LOGGER.info(Arrays.toString(counters));
+
+    } catch (SQLException | TriggerManagementException e) {
+      fail(e.getMessage());
+    } finally {
+      stopDataGenerator();
+    }
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/trigger/executor/TriggerEngine.java b/server/src/main/java/org/apache/iotdb/db/engine/trigger/executor/TriggerEngine.java
index 458ae3e240..fcf17622ce 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/trigger/executor/TriggerEngine.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/trigger/executor/TriggerEngine.java
@@ -40,6 +40,10 @@ public class TriggerEngine {
 
   public static void fire(TriggerEvent event, InsertRowPlan insertRowPlan)
       throws TriggerExecutionException {
+    if (TriggerRegistrationService.getInstance().executorSize() == 0) {
+      return;
+    }
+
     IMeasurementMNode[] mNodes = insertRowPlan.getMeasurementMNodes();
     int size = mNodes.length;
 
@@ -51,16 +55,18 @@ public class TriggerEngine {
       if (mNode == null) {
         continue;
       }
-      TriggerExecutor executor = mNode.getTriggerExecutor();
-      if (executor == null) {
-        continue;
+      for (TriggerExecutor executor : mNode.getUpperTriggerExecutorList()) {
+        executor.fireIfActivated(event, timestamp, values[i], mNode.getSchema().getType());
       }
-      executor.fireIfActivated(event, timestamp, values[i]);
     }
   }
 
   public static void fire(TriggerEvent event, InsertTabletPlan insertTabletPlan, int firePosition)
       throws TriggerExecutionException {
+    if (TriggerRegistrationService.getInstance().executorSize() == 0) {
+      return;
+    }
+
     IMeasurementMNode[] mNodes = insertTabletPlan.getMeasurementMNodes();
     int size = mNodes.length;
 
@@ -76,11 +82,9 @@ public class TriggerEngine {
       if (mNode == null) {
         continue;
       }
-      TriggerExecutor executor = mNode.getTriggerExecutor();
-      if (executor == null) {
-        continue;
+      for (TriggerExecutor executor : mNode.getUpperTriggerExecutorList()) {
+        executor.fireIfActivated(event, timestamps, columns[i], mNode.getSchema().getType());
       }
-      executor.fireIfActivated(event, timestamps, columns[i]);
     }
   }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/trigger/executor/TriggerExecutor.java b/server/src/main/java/org/apache/iotdb/db/engine/trigger/executor/TriggerExecutor.java
index 513e813db5..ea26758559 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/trigger/executor/TriggerExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/trigger/executor/TriggerExecutor.java
@@ -26,7 +26,7 @@ import org.apache.iotdb.db.engine.trigger.service.TriggerClassLoader;
 import org.apache.iotdb.db.engine.trigger.service.TriggerRegistrationInformation;
 import org.apache.iotdb.db.exception.TriggerExecutionException;
 import org.apache.iotdb.db.exception.TriggerManagementException;
-import org.apache.iotdb.db.metadata.mnode.IMeasurementMNode;
+import org.apache.iotdb.db.metadata.mnode.IMNode;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.utils.Binary;
 
@@ -39,23 +39,21 @@ public class TriggerExecutor {
 
   private final TriggerClassLoader classLoader;
 
-  private final IMeasurementMNode measurementMNode;
-  private final TSDataType seriesDataType;
+  private final IMNode imNode;
 
   private final Trigger trigger;
 
   public TriggerExecutor(
       TriggerRegistrationInformation registrationInformation,
       TriggerClassLoader classLoader,
-      IMeasurementMNode measurementMNode)
+      IMNode imNode)
       throws TriggerManagementException {
     this.registrationInformation = registrationInformation;
     attributes = new TriggerAttributes(registrationInformation.getAttributes());
 
     this.classLoader = classLoader;
 
-    this.measurementMNode = measurementMNode;
-    seriesDataType = measurementMNode.getSchema().getType();
+    this.imNode = imNode;
 
     trigger = constructTriggerInstance();
   }
@@ -137,14 +135,16 @@ public class TriggerExecutor {
     }
   }
 
-  public void fireIfActivated(TriggerEvent event, long timestamp, Object value)
+  public void fireIfActivated(
+      TriggerEvent event, long timestamp, Object value, TSDataType seriesDataType)
       throws TriggerExecutionException {
     if (!registrationInformation.isStopped() && event.equals(registrationInformation.getEvent())) {
-      fire(timestamp, value);
+      fire(timestamp, value, seriesDataType);
     }
   }
 
-  private synchronized void fire(long timestamp, Object value) throws TriggerExecutionException {
+  private synchronized void fire(long timestamp, Object value, TSDataType seriesDataType)
+      throws TriggerExecutionException {
     Thread.currentThread().setContextClassLoader(classLoader);
 
     try {
@@ -177,14 +177,15 @@ public class TriggerExecutor {
     }
   }
 
-  public void fireIfActivated(TriggerEvent event, long[] timestamps, Object values)
+  public void fireIfActivated(
+      TriggerEvent event, long[] timestamps, Object values, TSDataType seriesDataType)
       throws TriggerExecutionException {
     if (!registrationInformation.isStopped() && event.equals(registrationInformation.getEvent())) {
-      fire(timestamps, values);
+      fire(timestamps, values, seriesDataType);
     }
   }
 
-  private synchronized void fire(long[] timestamps, Object values)
+  private synchronized void fire(long[] timestamps, Object values, TSDataType seriesDataType)
       throws TriggerExecutionException {
     Thread.currentThread().setContextClassLoader(classLoader);
 
@@ -231,8 +232,8 @@ public class TriggerExecutor {
     return registrationInformation;
   }
 
-  public IMeasurementMNode getMeasurementMNode() {
-    return measurementMNode;
+  public IMNode getIMNode() {
+    return imNode;
   }
 
   @TestOnly
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/trigger/service/TriggerRegistrationService.java b/server/src/main/java/org/apache/iotdb/db/engine/trigger/service/TriggerRegistrationService.java
index 5f8e39661b..7f6c44928c 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/trigger/service/TriggerRegistrationService.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/trigger/service/TriggerRegistrationService.java
@@ -33,6 +33,7 @@ import org.apache.iotdb.db.exception.TriggerManagementException;
 import org.apache.iotdb.db.exception.metadata.MetadataException;
 import org.apache.iotdb.db.metadata.idtable.IDTable;
 import org.apache.iotdb.db.metadata.idtable.IDTableManager;
+import org.apache.iotdb.db.metadata.mnode.IMNode;
 import org.apache.iotdb.db.metadata.mnode.IMeasurementMNode;
 import org.apache.iotdb.db.metadata.path.PartialPath;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
@@ -95,15 +96,15 @@ public class TriggerRegistrationService implements IService {
 
   public synchronized void register(CreateTriggerPlan plan)
       throws TriggerManagementException, TriggerExecutionException {
-    IMeasurementMNode measurementMNode = tryGetMeasurementMNode(plan);
-    checkIfRegistered(plan, measurementMNode);
+    IMNode imNode = tryGetMNode(plan);
+    checkIfRegistered(plan, imNode);
     tryAppendRegistrationLog(plan);
-    doRegister(plan, measurementMNode);
+    doRegister(plan, imNode);
   }
 
-  private void checkIfRegistered(CreateTriggerPlan plan, IMeasurementMNode measurementMNode)
+  private void checkIfRegistered(CreateTriggerPlan plan, IMNode imNode)
       throws TriggerManagementException {
-    TriggerExecutor executor = measurementMNode.getTriggerExecutor();
+    TriggerExecutor executor = imNode.getTriggerExecutor();
     if (executor != null) {
       TriggerRegistrationInformation information = executor.getRegistrationInformation();
       throw new TriggerManagementException(
@@ -113,7 +114,7 @@ public class TriggerRegistrationService implements IService {
               plan.getClassName(),
               information.getTriggerName(),
               information.getClassName(),
-              measurementMNode.getFullPath()));
+              imNode.getFullPath()));
     }
 
     executor = executors.get(plan.getTriggerName());
@@ -133,10 +134,14 @@ public class TriggerRegistrationService implements IService {
     }
   }
 
-  private IMeasurementMNode tryGetMeasurementMNode(CreateTriggerPlan plan)
-      throws TriggerManagementException {
+  private IMNode tryGetMNode(CreateTriggerPlan plan) throws TriggerManagementException {
     try {
-      return IoTDB.schemaProcessor.getMeasurementMNodeForTrigger(plan.getFullPath());
+      IMNode imNode = IoTDB.schemaProcessor.getMNodeForTrigger(plan.getFullPath());
+      if (imNode == null) {
+        throw new TriggerManagementException(
+            String.format("Path [%s] does not exist", plan.getFullPath().getFullPath()));
+      }
+      return imNode;
     } catch (MetadataException e) {
       throw new TriggerManagementException(e.getMessage(), e);
     }
@@ -153,7 +158,7 @@ public class TriggerRegistrationService implements IService {
     }
   }
 
-  private void doRegister(CreateTriggerPlan plan, IMeasurementMNode measurementMNode)
+  private void doRegister(CreateTriggerPlan plan, IMNode imNode)
       throws TriggerManagementException, TriggerExecutionException {
     TriggerRegistrationInformation information = new TriggerRegistrationInformation(plan);
     TriggerClassLoader classLoader =
@@ -161,7 +166,7 @@ public class TriggerRegistrationService implements IService {
 
     TriggerExecutor executor;
     try {
-      executor = new TriggerExecutor(information, classLoader, measurementMNode);
+      executor = new TriggerExecutor(information, classLoader, imNode);
       executor.onCreate();
     } catch (TriggerManagementException | TriggerExecutionException e) {
       TriggerClassLoaderManager.getInstance().deregister(plan.getClassName());
@@ -169,14 +174,16 @@ public class TriggerRegistrationService implements IService {
     }
 
     executors.put(plan.getTriggerName(), executor);
-    measurementMNode.setTriggerExecutor(executor);
+    imNode.setTriggerExecutor(executor);
 
     // update id table
     if (CONFIG.isEnableIDTable()) {
       try {
         IDTable idTable =
             IDTableManager.getInstance().getIDTable(plan.getFullPath().getDevicePath());
-        idTable.registerTrigger(plan.getFullPath(), measurementMNode);
+        if (executor.getIMNode().isMeasurement()) {
+          idTable.registerTrigger(plan.getFullPath(), (IMeasurementMNode) imNode);
+        }
       } catch (MetadataException e) {
         throw new TriggerManagementException(e.getMessage(), e);
       }
@@ -214,10 +221,11 @@ public class TriggerRegistrationService implements IService {
 
   private void doDeregister(DropTriggerPlan plan) throws TriggerManagementException {
     TriggerExecutor executor = executors.remove(plan.getTriggerName());
-    IMeasurementMNode measurementMNode = executor.getMeasurementMNode();
+
+    IMNode imNode = executor.getIMNode();
     try {
-      measurementMNode.setTriggerExecutor(null);
-      IoTDB.schemaProcessor.releaseMeasurementMNodeAfterDropTrigger(executor.getMeasurementMNode());
+      imNode.setTriggerExecutor(null);
+      IoTDB.schemaProcessor.releaseMNodeAfterDropTrigger(imNode);
     } catch (MetadataException e) {
       throw new TriggerManagementException(e.getMessage(), e);
     }
@@ -234,9 +242,11 @@ public class TriggerRegistrationService implements IService {
     // update id table
     if (CONFIG.isEnableIDTable()) {
       try {
-        PartialPath fullPath = executor.getMeasurementMNode().getPartialPath();
+        PartialPath fullPath = executor.getIMNode().getPartialPath();
         IDTable idTable = IDTableManager.getInstance().getIDTable(fullPath.getDevicePath());
-        idTable.deregisterTrigger(fullPath, executor.getMeasurementMNode());
+        if (executor.getIMNode().isMeasurement()) {
+          idTable.deregisterTrigger(fullPath, (IMeasurementMNode) executor.getIMNode());
+        }
       } catch (MetadataException e) {
         throw new TriggerManagementException(e.getMessage(), e);
       }
@@ -373,7 +383,7 @@ public class TriggerRegistrationService implements IService {
   private void doRecoveryFromLogFile(File logFile) throws IOException, TriggerManagementException {
     for (CreateTriggerPlan createTriggerPlan : recoverCreateTriggerPlans(logFile)) {
       try {
-        doRegister(createTriggerPlan, tryGetMeasurementMNode(createTriggerPlan));
+        doRegister(createTriggerPlan, tryGetMNode(createTriggerPlan));
         if (createTriggerPlan.isStopped()) {
           executors.get(createTriggerPlan.getTriggerName()).onStop();
         }
@@ -477,6 +487,10 @@ public class TriggerRegistrationService implements IService {
     return ServiceType.TRIGGER_REGISTRATION_SERVICE;
   }
 
+  public int executorSize() {
+    return executors.size();
+  }
+
   public static TriggerRegistrationService getInstance() {
     return TriggerRegistrationService.TriggerRegistrationServiceHelper.INSTANCE;
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/LocalSchemaProcessor.java b/server/src/main/java/org/apache/iotdb/db/metadata/LocalSchemaProcessor.java
index 1f43b14070..0ad80d68a5 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/LocalSchemaProcessor.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/LocalSchemaProcessor.java
@@ -1387,19 +1387,16 @@ public class LocalSchemaProcessor {
 
   // region Interfaces for Trigger
 
-  public IMeasurementMNode getMeasurementMNodeForTrigger(PartialPath fullPath)
-      throws MetadataException {
+  public IMNode getMNodeForTrigger(PartialPath fullPath) throws MetadataException {
     try {
-      return getBelongedSchemaRegion(fullPath).getMeasurementMNodeForTrigger(fullPath);
+      return getBelongedSchemaRegion(fullPath).getMNodeForTrigger(fullPath);
     } catch (StorageGroupNotSetException e) {
       throw new PathNotExistException(fullPath.getFullPath());
     }
   }
 
-  public void releaseMeasurementMNodeAfterDropTrigger(IMeasurementMNode measurementMNode)
-      throws MetadataException {
-    getBelongedSchemaRegion(measurementMNode.getPartialPath())
-        .releaseMeasurementMNodeAfterDropTrigger(measurementMNode);
+  public void releaseMNodeAfterDropTrigger(IMNode imNode) throws MetadataException {
+    getBelongedSchemaRegion(imNode.getPartialPath()).releaseMNodeAfterDropTrigger(imNode);
   }
 
   // endregion
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/idtable/entry/InsertMeasurementMNode.java b/server/src/main/java/org/apache/iotdb/db/metadata/idtable/entry/InsertMeasurementMNode.java
index 4199e43bac..48b9b16275 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/idtable/entry/InsertMeasurementMNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/idtable/entry/InsertMeasurementMNode.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.db.metadata.idtable.entry;
 
+import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.db.engine.trigger.executor.TriggerExecutor;
 import org.apache.iotdb.db.metadata.lastCache.container.ILastCacheContainer;
 import org.apache.iotdb.db.metadata.logfile.MLogWriter;
@@ -35,6 +36,9 @@ import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.write.schema.IMeasurementSchema;
 import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * Generated entity implements IMeasurementMNode interface to unify insert logic through id table
  * and SchemaProcessor
@@ -63,6 +67,22 @@ public class InsertMeasurementMNode implements IMeasurementMNode {
   }
 
   // region support methods
+
+  @Override
+  public List<TriggerExecutor> getUpperTriggerExecutorList() {
+    IMNode currentNode = this;
+    List<TriggerExecutor> results = new ArrayList<>();
+    while (currentNode != null && !IoTDBConstant.PATH_ROOT.equals(currentNode.getName())) {
+      TriggerExecutor executor = currentNode.getTriggerExecutor();
+      currentNode = currentNode.getParent();
+      if (executor == null) {
+        continue;
+      }
+      results.add(executor);
+    }
+    return results;
+  }
+
   @Override
   public TriggerExecutor getTriggerExecutor() {
     return triggerExecutor;
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IMNode.java b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IMNode.java
index 079d096e44..4167cc5c9b 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IMNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IMNode.java
@@ -18,6 +18,7 @@
  */
 package org.apache.iotdb.db.metadata.mnode;
 
+import org.apache.iotdb.db.engine.trigger.executor.TriggerExecutor;
 import org.apache.iotdb.db.metadata.logfile.MLogWriter;
 import org.apache.iotdb.db.metadata.mnode.container.IMNodeContainer;
 import org.apache.iotdb.db.metadata.mtree.store.disk.cache.CacheEntry;
@@ -26,6 +27,7 @@ import org.apache.iotdb.db.metadata.template.Template;
 
 import java.io.IOException;
 import java.io.Serializable;
+import java.util.List;
 
 /** This interface defines a MNode's operation interfaces. */
 public interface IMNode extends Serializable {
@@ -87,6 +89,12 @@ public interface IMNode extends Serializable {
 
   IMeasurementMNode getAsMeasurementMNode();
 
+  List<TriggerExecutor> getUpperTriggerExecutorList();
+
+  TriggerExecutor getTriggerExecutor();
+
+  void setTriggerExecutor(TriggerExecutor triggerExecutor);
+
   void serializeTo(MLogWriter logWriter) throws IOException;
 
   CacheEntry getCacheEntry();
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNode.java b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNode.java
index 1e275710c0..1728f09097 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNode.java
@@ -19,6 +19,7 @@
 package org.apache.iotdb.db.metadata.mnode;
 
 import org.apache.iotdb.commons.conf.IoTDBConstant;
+import org.apache.iotdb.db.engine.trigger.executor.TriggerExecutor;
 import org.apache.iotdb.db.metadata.mtree.store.disk.cache.CacheEntry;
 import org.apache.iotdb.db.metadata.path.PartialPath;
 
@@ -36,6 +37,9 @@ public abstract class MNode implements IMNode {
   /** from root to this node, only be set when used once for InternalMNode */
   protected String fullPath;
 
+  /** registered trigger */
+  protected TriggerExecutor triggerExecutor;
+
   protected CacheEntry cacheEntry;
 
   /** Constructor of MNode. */
@@ -158,6 +162,31 @@ public abstract class MNode implements IMNode {
     }
   }
 
+  @Override
+  public List<TriggerExecutor> getUpperTriggerExecutorList() {
+    IMNode currentNode = this;
+    List<TriggerExecutor> results = new ArrayList<>();
+    while (currentNode != null && !IoTDBConstant.PATH_ROOT.equals(currentNode.getName())) {
+      TriggerExecutor executor = currentNode.getTriggerExecutor();
+      currentNode = currentNode.getParent();
+      if (executor == null) {
+        continue;
+      }
+      results.add(executor);
+    }
+    return results;
+  }
+
+  @Override
+  public TriggerExecutor getTriggerExecutor() {
+    return triggerExecutor;
+  }
+
+  @Override
+  public void setTriggerExecutor(TriggerExecutor triggerExecutor) {
+    this.triggerExecutor = triggerExecutor;
+  }
+
   @Override
   public boolean equals(Object o) {
     if (this == o) {
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MeasurementMNode.java b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MeasurementMNode.java
index f1826c1829..3909f0a471 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MeasurementMNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MeasurementMNode.java
@@ -47,8 +47,6 @@ public class MeasurementMNode extends MNode implements IMeasurementMNode {
   private IMeasurementSchema schema;
   /** last value cache */
   private volatile ILastCacheContainer lastCacheContainer = null;
-  /** registered trigger */
-  private TriggerExecutor triggerExecutor = null;
 
   /**
    * MeasurementMNode factory method. The type of returned MeasurementMNode is according to the
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/estimator/BasicMNodSizeEstimator.java b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/estimator/BasicMNodSizeEstimator.java
index 7d6b2884d4..7c18ac1bb4 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/estimator/BasicMNodSizeEstimator.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/estimator/BasicMNodSizeEstimator.java
@@ -34,6 +34,7 @@ public class BasicMNodSizeEstimator implements IMNodeSizeEstimator {
    *         <li>parent reference, 8B
    *         <li>fullPath reference, 8B
    *         <li>cacheEntry reference, 8B
+   *         <li>trigger reference, 8B
    *       </ol>
    *   <li>MapEntry in parent
    *       <ol>
@@ -43,7 +44,7 @@ public class BasicMNodSizeEstimator implements IMNodeSizeEstimator {
    *       </ol>
    * </ol>
    */
-  protected static final int NODE_BASE_SIZE = 92;
+  protected static final int NODE_BASE_SIZE = 100;
 
   /**
    * The basic extra memory occupied by an InternalMNode based on MNode occupation
@@ -85,10 +86,9 @@ public class BasicMNodSizeEstimator implements IMNodeSizeEstimator {
    *   <li>tagOffset, 8B
    *   <li>estimated schema size, 32B
    *   <li>lastCache, 8B
-   *   <li>trigger, 8B
    * </ol>
    */
-  protected static final int MEASUREMENT_NODE_BASE_SIZE = 64;
+  protected static final int MEASUREMENT_NODE_BASE_SIZE = 56;
   // alias length, hashCode and occupation in aliasMap, 4 + 4 + 44 = 52B
   protected static final int ALIAS_BASE_SIZE = 52;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/ISchemaRegion.java b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/ISchemaRegion.java
index 9008224310..73359b8b53 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/ISchemaRegion.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/ISchemaRegion.java
@@ -186,8 +186,7 @@ public interface ISchemaRegion {
 
   void setUsingSchemaTemplate(ActivateTemplatePlan plan) throws MetadataException;
 
-  IMeasurementMNode getMeasurementMNodeForTrigger(PartialPath fullPath) throws MetadataException;
+  IMNode getMNodeForTrigger(PartialPath fullPath) throws MetadataException;
 
-  void releaseMeasurementMNodeAfterDropTrigger(IMeasurementMNode measurementMNode)
-      throws MetadataException;
+  void releaseMNodeAfterDropTrigger(IMNode imNode) throws MetadataException;
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegion.java b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegion.java
index 7599a45942..93f048ae7b 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegion.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegion.java
@@ -1158,6 +1158,7 @@ public class SchemaRegion implements ISchemaRegion {
   // endregion
 
   // region Interfaces and methods for MNode query
+
   public IMNode getDeviceNode(PartialPath path) throws MetadataException {
     IMNode node;
     try {
@@ -1847,14 +1848,12 @@ public class SchemaRegion implements ISchemaRegion {
 
   // region Interfaces for Trigger
 
-  public IMeasurementMNode getMeasurementMNodeForTrigger(PartialPath fullPath)
-      throws MetadataException {
-    return mtree.getMeasurementMNode(fullPath);
+  public IMNode getMNodeForTrigger(PartialPath fullPath) throws MetadataException {
+    return mtree.getNodeByPath(fullPath);
   }
 
-  public void releaseMeasurementMNodeAfterDropTrigger(IMeasurementMNode measurementMNode)
-      throws MetadataException {
-    mtree.unPinMNode(measurementMNode);
+  public void releaseMNodeAfterDropTrigger(IMNode imNode) throws MetadataException {
+    mtree.unPinMNode(imNode);
   }
 
   // endregion
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/RSchemaRegion.java b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/RSchemaRegion.java
index 5026693ee1..57afaeb8dd 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/RSchemaRegion.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/RSchemaRegion.java
@@ -1894,14 +1894,12 @@ public class RSchemaRegion implements ISchemaRegion {
   }
 
   @Override
-  public IMeasurementMNode getMeasurementMNodeForTrigger(PartialPath fullPath)
-      throws MetadataException {
+  public IMNode getMNodeForTrigger(PartialPath fullPath) throws MetadataException {
     throw new UnsupportedOperationException();
   }
 
   @Override
-  public void releaseMeasurementMNodeAfterDropTrigger(IMeasurementMNode measurementMNode)
-      throws MetadataException {
+  public void releaseMNodeAfterDropTrigger(IMNode imNode) throws MetadataException {
     throw new UnsupportedOperationException();
   }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/mnode/RMNode.java b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/mnode/RMNode.java
index ee9d9983c3..b1e5bb6c86 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/mnode/RMNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/mnode/RMNode.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.db.metadata.schemaregion.rocksdb.mnode;
 
+import org.apache.iotdb.db.engine.trigger.executor.TriggerExecutor;
 import org.apache.iotdb.db.exception.metadata.IllegalPathException;
 import org.apache.iotdb.db.exception.metadata.MetadataException;
 import org.apache.iotdb.db.metadata.mnode.IEntityMNode;
@@ -36,6 +37,7 @@ import org.rocksdb.RocksDBException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.List;
 import java.util.Objects;
 
 public abstract class RMNode implements IMNode {
@@ -50,6 +52,9 @@ public abstract class RMNode implements IMNode {
 
   protected static final Logger logger = LoggerFactory.getLogger(RMNode.class);
 
+  /** registered trigger */
+  protected TriggerExecutor triggerExecutor;
+
   /** Constructor of MNode. */
   public RMNode(String fullPath, RSchemaReadWriteHandler readWriteHandler) {
     this.fullPath = fullPath.intern();
@@ -189,6 +194,21 @@ public abstract class RMNode implements IMNode {
     }
   }
 
+  @Override
+  public List<TriggerExecutor> getUpperTriggerExecutorList() {
+    throw new UnsupportedOperationException("Temporarily unsupported");
+  }
+
+  @Override
+  public TriggerExecutor getTriggerExecutor() {
+    return triggerExecutor;
+  }
+
+  @Override
+  public void setTriggerExecutor(TriggerExecutor triggerExecutor) {
+    this.triggerExecutor = triggerExecutor;
+  }
+
   @Override
   public boolean equals(Object o) {
     if (this == o) {