Function trong Supabase: Tạo và sử dụng stored procedures hiệu quả

25/02/2026 P T P Chung 6 phút đọc 0 bình luận

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 EditorSQL 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.

Quảng cáo

728x90 Bottom Advertisement

Thay thế bằng mã Google AdSense

Chia sẻ bài viết

Facebook Twitter

Bình luận

Chia sẻ ý kiến của bạn về bài viết này

Viết bình luận

Bình luận của bạn sẽ được kiểm duyệt trước khi hiển thị

Chưa có bình luận nào

Hãy là người đầu tiên bình luận về bài viết này!