本篇文章主要介紹Supabase
裡的Trigger的功能,詳細說明什麼是Trigger和使用時機,以及如何在後台瀏覽和設定Trigger,此外,文章中會提供一個常用的Trigger功能範例。
嗨歡迎閱讀我的文章!這是關於Supabase的系列文章,內容包含介紹Supabase是什麼、基本功能應用,深入了解Supabase的進階功能應用。
觸發器(Trigger)是一個在資料庫中自動執行任務的功能,而這個觸發器可以劃分成兩個部分,第一個是觸發的條件,第二個則是執行的內容。
觸發條件就是在資料庫的表格發生新增、更新、刪除資料等時間點,可以設定是要在執行表格任務的前或後執行函式或任務。
當指定的觸發條件發生時,就會執行設定好的函式或任務,並將此次執行所需的資料傳遞至該函式。通常,這可以用於驗證資料格式、進行邏輯處理、記錄等功能。當然,也可用於執行大量重複的資料表格操作。
在supabase
中,直接進入後台介面後選擇Database
頁籤,選擇Triggers,就可以看到目前這個資料庫裡面的所有觸發器。
首次進入頁面可以看到很多預設的觸發器,點擊右上角的Create a new trigger可以開啟新增觸發器的介面。
supabase
非常友善於不太會撰寫SQL的人提供這個面板,可以根據想要的觸發器功能依照欄位填寫,最下方再把基本的SQL填入新增即可。
對於PostgreSQL
相當熟悉的人依舊可以選擇由SQL Editor直接撰寫想要的觸發器功能,甚至可以連同需要執行的函式功能一起新增綁定。
當然在現今版本中有Supabase AI
的協助之下也能夠產生出觸發器基本的語法,再根據內容做微調或是修改就可以。
延續前面文章的內容,我希望在我的待辦清單表格中新增一個名為updated_at
的欄位。每當我更新按讚數字時,這個欄位的值都會被更新為當前的時間。
updated_at
是很多表格都會具備的欄位。
設定這個觸發器的目的是為了減輕前端執行重複的工作負擔。否則,如果在前端更新資料後再重新更新欄位時間,這個過程將變得更加複雜。
去前面幾篇提到的新增函式的頁面,直接新增一個全新的函式。
名字叫做update_time
,Reture 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
,細項如下:
todos
。Update
勾選。Before the event
在更新前就把時間更新完成。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)的話,能夠幫助開發者減少重複執行的工作,提高資料庫效能和安全性,可以說是一個強大而且實用的功能。