DEV Community

MariaZentsova
MariaZentsova

Posted on

Creating trigger functions with Supabase

One of the really interesting products, I've tried recently is supabase. It allows to create a backend for a react app with Postgresql as a database in a few minutes.

One of the most powerful features of Supabase is that it allows to use advanced Postgresql capabilities in a very easy way.

For instance, I needed to produce a table with aggregated statistics from another table, and update the aggregated stats on every data change. We often need this aggregated state of the data for analytics and charts.

pie chart

To do this, we will use postgresql triggers in order to subscribe for particular events, like records update, insert and delete.

This capability is available in a Supabase -> Database section.

First, we need to create a function, that will fire off on any changes in the table. To do so, go to Database -> Functions -> Create a new function.

The return type of the function would be trigger.

creating supabase function

The function I use creates an aggregated statistics from the funding table, resulting in amount of startup funding generated by country and industry type.



begin
  insert into public.investment_industry_country(industry_id, country_id, total_usd)
  SELECT 
  s.industry, 
  s.startup_hq, 
  SUM(f.amount_usd) AS ku
FROM public.startups s 
LEFT JOIN public.funding f 
  ON s.id = f.startup_id
GROUP BY 
  s.industry, 
  s.startup_hq

on conflict(industry_id, country_id) 
do update set total_usd = EXCLUDED.total_usd;
return null;
end;


Enter fullscreen mode Exit fullscreen mode

Also, as this function should have access to our tables, we need to set it up as a security definer.

Image description

To make use of this function, we need to set up an actual trigger via Database -> Triggers -> Create a new trigger.

After we gave a name to the trigger, and assigned a table it will keep track of, we can select what types of events we are interested in. As I want an aggregated view, I selected all types of data changes - create, update and delete.

supabase triggers

Then, we could select a function we've created earlier, which would run after table changes.

supabase trigger select a function

Once we click "confirm" the trigger is ready and the work of creating table for analytics is automated.

Here is how using extended supabase backend, we've created an aggregated table, that allows to produce some charts and statistics. Supabase makes it quite easy to utilise advanced Supabase capabilities and extend the database functionality.

Top comments (1)

Collapse
 
arpankiit2017 profile image
ArpanKIIT2017

If we define the SECURITY as INVOKER will the queries executed as a part of the trigger body respect RLS defined as per the logged in Supabase User (as in those policies that use auth.uid()).

Also if any query within the block operate on rows that are not accessible within the RLS policy, will it exclude them or throw error?