Skip to main content
Version: 1.0.2

DEFINE EVENT

DEFINE EVENT statement

Events can be triggered after any change or modification to the data in a record. Each trigger is able to see the $before and $after value of the record, enabling advanced custom logic with each trigger.

Requirements

Statement syntax

SurrealQL Syntax
DEFINE EVENT @name ON [ TABLE ] @table [ WHEN @expression ] THEN @expression

Example usage

Below is an example showing how to create an event which upon updating a user's email address will create an entry recording the change on an event table.

-- Create a new event whenever a user changes their email address
-- One-statement event
DEFINE EVENT email ON TABLE user WHEN $before.email != $after.email THEN (
CREATE event SET user = $value.id, time = time::now(), value = $after.email, action = 'email_changed'
);

-- Create a relation between a customer and a product whenever a purchase is made
-- Notice the subtle difference when we use multiple statements inside an event:
-- we have to use {curly brackets} instead of (parenthesis)
DEFINE EVENT purchase ON TABLE purchase WHEN $before == NONE THEN {
LET $from = (SELECT * FROM customer WHERE id == $after.customer);
LET $to = (SELECT * FROM product WHERE id == $after.product);

RELATE $from->purchases->$to CONTENT {
quantity: $after.quantity,
total: $after.total,
status: 'Pending',
};
};

Specific events

You can trigger events based on specific events. You can use the variable $event to detect what type of event is triggered on the table.

-- CREATE event is triggered when a new record is inserted into the table.
-- Here we are updating the status of the post to PUBLISHED
-- when a new record is inserted into the publish_post table.
DEFINE EVENT publish_post ON TABLE publish_post WHEN $event = "CREATE" THEN (
UPDATE post SET status = "PUBLISHED" WHERE id = $after.post_id
);

-- UPDATE event
-- Here we are creating a notification when a user is updated.
DEFINE EVENT user_updated ON TABLE user WHEN $event = "UPDATE" THEN (
CREATE notification SET message = "User updated", user_id = $after.id, created_at = time::now()
);

-- DELETE event is triggered when a record is deleted from the table.
-- Here we are creating a notification when a user is deleted.
DEFINE EVENT user_deleted ON TABLE user WHEN $event = "DELETE" THEN (
CREATE notification SET message = "User deleted", user_id = $before.id, created_at = time::now()
);

-- You can combine multiple events based on your use cases.
-- Here we are creating a log when a user is created, updated or deleted.
DEFINE EVENT user_event ON TABLE user WHEN $event = "CREATE" OR $event = "UPDATE" OR $event = "DELETE" THEN (
CREATE log SET table = "user", event = $event, created_at = time::now()
);