Function trong Supabase: Tạo và sử dụng stored procedures
Khi làm việc với cơ sở dữ liệu quan hệ, việc lặp lại các tác vụ SQL phức tạp trên nhiều vị trí trong ứng dụng không chỉ gây phiền toái mà còn tiềm ẩn nguy cơ sai sót. Supabase giải quyết vấn đề này bằng cách cung cấp stored procedures (thủ tục lưu trữ) thông qua tính năng Function. Đây là cách hiệu quả để đóng gói logic truy vấn, đảm bảo tính nhất quán và tăng hiệu năng.
Stored procedures là gì và tại sao nên dùng?
Stored procedures là các khối mã SQL được lưu trữ trực tiếp trong cơ sở dữ liệu. Thay vì viết lại cùng một truy vấn nhiều lần, bạn chỉ cần gọi tên procedure. Lợi ích bao gồm: - Hiệu năng: Database engine tối ưu hóa việc thực thi. - Bảo mật: Hạn chế quyền truy cập trực tiếp vào bảng, chỉ cho phép gọi procedure. - Tính nhất quán: Logic được tập trung tại một nơi, tránh lỗi do copy-paste. - Dễ bảo trì: Thay đổi logic ở một chỗ, toàn bộ ứng dụng được cập nhật.
Tạo Function trong Supabase
Supabase cung cấp hai cách chính để tạo Function: qua Table Editor và SQL Editor.
Tạo Function qua Table Editor
1. Truy cập Table Editor trong dashboard Supabase.
2. Chọn tab Functions.
3. Click New Function.
4. Điền các thông tin:
- Function name: Tên procedure (ví dụ: get_user_by_email).
- Language: Thường là plpgsql cho PostgreSQL.
- Arguments: Tham số đầu vào (nếu có).
- Return type: Kiểu dữ liệu trả về (có thể là TABLE hoặc kiểu đơn).
- Function body: Viết code SQL bên trong.
5. Click Create.
Tạo Function qua SQL Editor
Với cách này, bạn viết trực tiếp câu lệnh SQL. Ví dụ tạo một function đơn giản:
CREATE OR REPLACE FUNCTION public.get_user_by_email(email_param text)
RETURNS SETOF users
AS $$
BEGIN
RETURN QUERY
SELECT *
FROM users
WHERE email = email_param;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
Nếu muốn function trả về JSON:
CREATE OR REPLACE FUNCTION public.get_user_by_email_json(email_param text)
RETURNS json
AS $$
BEGIN
RETURN (
SELECT json_agg(row_to_json(u))
FROM users u
WHERE email = email_param
);
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
Gọi và sử dụng Function
Sau khi tạo, bạn có thể gọi Function từ nhiều vị trí:
Gọi từ Supabase Dashboard
Trong SQL Editor, chạy:
SELECT * FROM public.get_user_by_email('[email protected]');
Hoặc với function trả về JSON:
Quảng cáo
300x250 In-Content Advertisement
SELECT public.get_user_by_email_json('[email protected]');
Gọi từ ứng dụng (Client-side)
Sử dụng thư viện Supabase JS:
const { data, error } = await supabase
.rpc('get_user_by_email', {
email_param: '[email protected]'
});
Hoặc gọi trực tiếp SQL:
const { data, error } = await supabase
.sql('SELECT * FROM public.get_user_by_email($1)', ['[email protected]']);
Gọi từ Database Trigger
Function rất hữu ích khi kết hợp với trigger. Ví dụ tự động lưu log khi insert:
CREATE OR REPLACE FUNCTION public.log_user_insert()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO user_logs (user_id, action)
VALUES (NEW.id, 'INSERT');
RETURN NEW;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
CREATE TRIGGER log_user_insert_trigger
AFTER INSERT ON users
FOR EACH ROW
EXECUTE FUNCTION public.log_user_insert();
Một số lưu ý khi làm việc với Function
- Security: Dùng SECURITY DEFINER để function chạy với quyền của người tạo, nhưng cần cẩn thận với quyền hạn.
- Naming: Đặt tên function theo convention rõ ràng, tránh trùng với tên bảng hoặc cột.
- Return type: Nếu trả về nhiều cột, dùng SETOF table_name hoặc TABLE(col1 type, col2 type).
- Testing: Luôn test function trong SQL Editor trước khi gọi từ ứng dụng.
- Error handling: Dùng BEGIN...EXCEPTION...END để bắt lỗi trong function.
Kết luận
Function trong Supabase không chỉ giúp tổ chức code SQL gọn gàng mà còn tăng tính bảo mật và hiệu năng cho ứng dụng. Dù bạn là người mới hay đã quen với PostgreSQL, việc nắm vững cách tạo và sử dụng stored procedures sẽ giúp bạn xây dựng backend vững chắc và dễ bảo trì hơn. Hãy bắt đầu từ những function đơn giản, sau đó mở rộng dần cho các tác vụ phức tạp hơn.