---
title: Automate tasks with triggers | Tiger Data Docs
description: Use PostgreSQL triggers to automatically execute functions when data changes occur in TimescaleDB hypertables
---

TimescaleDB supports the full range of PostgreSQL triggers. Creating, altering, or dropping a trigger on a hypertable applies the same change across all underlying chunks.

## Create a trigger

This example creates a new table called `error_conditions` with the same schema as `conditions`, but that only stores records which are considered errors. An error, in this case, is when an application sends a `temperature` or `humidity` reading with a value that is greater than or equal to 1000.

1. **Create a function that inserts erroneous data into the `error_conditions` table**

   ```
   CREATE OR REPLACE FUNCTION record_error()
     RETURNS trigger AS $record_error$
   BEGIN
    IF NEW.temperature >= 1000 OR NEW.humidity >= 1000 THEN
      INSERT INTO error_conditions
        VALUES(NEW.time, NEW.location, NEW.temperature, NEW.humidity);
    END IF;
    RETURN NEW;
   END;
   $record_error$ LANGUAGE plpgsql;
   ```

2. **Create a trigger that calls this function whenever a new row is inserted into the hypertable**

   ```
   CREATE TRIGGER record_error
     BEFORE INSERT ON conditions
     FOR EACH ROW
     EXECUTE FUNCTION record_error();
   ```

3. **Verify that error rows are captured**

   All data is inserted into the `conditions` table, but rows that contain errors are also added to the `error_conditions` table.

TimescaleDB supports the full range of triggers, including `BEFORE INSERT`, `AFTER INSERT`, `BEFORE UPDATE`, `AFTER UPDATE`, `BEFORE DELETE`, and `AFTER DELETE`. For more information, see the [PostgreSQL docs](https://www.postgresql.org/docs/current/sql-createtrigger.html).
