Supabase的觸發器功能介紹 | Trigger in Supabase

Nosegates
鼻爾蓋茲
Published in
Oct 11, 2023
supabase的觸發器功能介紹封面圖片
supabase的觸發器功能介紹封面圖片

本篇文章主要介紹Supabase裡的Trigger的功能,詳細說明什麼是Trigger和使用時機,以及如何在後台瀏覽和設定Trigger,此外,文章中會提供一個常用的Trigger功能範例。

嗨歡迎閱讀我的文章!這是關於Supabase的系列文章,內容包含介紹Supabase是什麼、基本功能應用,深入了解Supabase的進階功能應用。

什麼是觸發器(Trigger)?

觸發器(Trigger)是一個在資料庫中自動執行任務的功能,而這個觸發器可以劃分成兩個部分,第一個是觸發的條件,第二個則是執行的內容。

觸發條件

觸發條件就是在資料庫的表格發生新增更新刪除資料等時間點,可以設定是要在執行表格任務的前或後執行函式或任務。

執行的內容

當指定的觸發條件發生時,就會執行設定好的函式或任務,並將此次執行所需的資料傳遞至該函式。通常,這可以用於驗證資料格式、進行邏輯處理、記錄等功能。當然,也可用於執行大量重複的資料表格操作。

後台觸發器(Trigger)的位置

由後台面板新增

supabase中,直接進入後台介面後選擇Database頁籤,選擇Triggers,就可以看到目前這個資料庫裡面的所有觸發器。

Triggers在頁籤位置
Triggers在後台頁籤位置

首次進入頁面可以看到很多預設的觸發器,點擊右上角的Create a new trigger可以開啟新增觸發器的介面。

新增Triggers的面板
新增Triggers的面板

supabase非常友善於不太會撰寫SQL的人提供這個面板,可以根據想要的觸發器功能依照欄位填寫,最下方再把基本的SQL填入新增即可。

由SQL Editor新增

對於PostgreSQL相當熟悉的人依舊可以選擇由SQL Editor直接撰寫想要的觸發器功能,甚至可以連同需要執行的函式功能一起新增綁定。

當然在現今版本中有Supabase AI的協助之下也能夠產生出觸發器基本的語法,再根據內容做微調或是修改就可以。

新增首個觸發器

設定觸發器的目標

延續前面文章的內容,我希望在我的待辦清單表格中新增一個名為updated_at的欄位。每當我更新按讚數字時,這個欄位的值都會被更新為當前的時間。

updated_at是很多表格都會具備的欄位。

設定這個觸發器的目的是為了減輕前端執行重複的工作負擔。否則,如果在前端更新資料後再重新更新欄位時間,這個過程將變得更加複雜。

新增觸發器的函式

去前面幾篇提到的新增函式的頁面,直接新增一個全新的函式。

新增函式功能
新增函式功能

名字叫做update_timeReture type的欄位要設定成trigger才能在等一下觸發器的頁面選擇這個函式,下方Definition的內容如下。

BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;

大致上內容和上一篇文章提到的內容差不多,只是這次是在UI介面中設定,不用撰寫sql。

Supabase的函式功能介紹與實作 | Functions with Supabase

而這段sql中有用到環境變數NEW,實際上還有很多個環境變數可以使用,詳細的內容可以參考官方文件。

成功新增完成,在Functions的列表就可以看到剛剛的那個函式,Return type是寫trigger

新增完成出現在列表中
新增完成出現在列表中

到這裡已經完成新增函式的動作,接下來要去新增觸發器。

套用觸發器

把頁籤切回觸發器的地方,點擊右上角新增觸發器。

套用觸發器
套用觸發器

命名的部分就取個名字,我這裡是取叫做handle_updated_at,細項如下:

  • Table:選擇表格todos
  • Events:這裡可以選擇觸發的事件名稱,因為是更新時間所以把Update勾選。
  • Trigger type: 選擇Before the event在更新前就把時間更新完成。
  • Orientation:這個問題是,如果多筆資料同時滿足條件,是希望每筆資料都觸發一次事件,還是只在整筆資料觸發一次,這裡的情境下,希望每一筆資料在更新時都能夠被更新,因此選擇Row

把選項都填入以後按下新增,第一個觸發器就完成囉!接著進入測試的時間。

前端實測

新增完成觸發器的設定,接著就可以回到前端實測到底更新資料的時候會不會把updated_at的欄位一起更新至最新時間。

前端顯示最後更新時間
前端顯示最後更新時間

我把我的測試頁面挖一個表格空間給updated_at欄位顯示,所以現在只要對我的資料點讚發生更新,最後更新時間也會一起被更新到目前時間。

最後更新時間已更新
最後更新時間已更新

可以看到,當按讚ID 8的資料時,該筆資料的likes更新操作觸發了之前設定的函式,因此連帶著updated_at也同時被更新到最新的時間,這個觸發器設定成功生效。

直接使用插件更新時間

最後更新時間在實務上很常被使用,所以PostgreSQL有提供一個插件可以使用,直接提供整段sql一鍵開啟並且套用在表格上。

create extension if not exists moddatetime schema extensions;

create trigger
handle_updated_at before update
on <表格名稱>
for each row execute
procedure moddatetime(updated_at);

這段就是直接開啟這個插件,並且新增一個觸發器套用在表格上,當然先決條件是這個表格要有updated_at的欄位。

結語

善用觸發器(Trigger)的話,能夠幫助開發者減少重複執行的工作,提高資料庫效能和安全性,可以說是一個強大而且實用的功能。

有興趣的內容

--

--