Giao diện
Câu hỏi thường gặp — Collection SQL
Sử dụng chung
Có thể dùng tham số động trong SQL không?
Không trực tiếp. Câu SQL được lưu dạng tĩnh. Tuy nhiên, khi người dùng sử dụng bộ lọc (filter) trên giao diện, plugin sẽ tự động thêm điều kiện WHERE vào bên ngoài câu SQL gốc (dưới dạng subquery wrapper). Điều này cho phép lọc dữ liệu mà không cần sửa SQL.
Kết quả có được cache không?
Không. Mỗi lần truy cập dữ liệu, SQL sẽ được thực thi lại hoàn toàn. Plugin không có cơ chế cache nội bộ. Nếu cần cache, hãy cân nhắc tạo materialized view ở tầng database và trỏ SQL Collection đến view đó.
Có thể dùng SQL JOIN nhiều bảng không?
Có. Bất kỳ câu SELECT hợp lệ nào cũng được hỗ trợ, bao gồm JOIN, GROUP BY, subquery, UNION, WITH (CTE). Plugin phân tích SQL AST để suy luận trường và bảng nguồn.
Tại sao một số trường không hiển thị interface/kiểu dữ liệu?
Plugin suy luận trường bằng cách ánh xạ bảng và cột trong SQL với các collection đã tồn tại trong hệ thống. Nếu:
- Bảng trong SQL không tương ứng với collection nào (ví dụ: bảng hệ thống, temp table)
- Cột là kết quả tính toán (
SUM(...),COUNT(...)) - Dùng alias mà không rõ nguồn
Thì trường đó sẽ xuất hiện nhưng không có metadata (type, interface). Bạn có thể cấu hình thủ công sau khi tạo.
SQL Collection có hỗ trợ phân trang không?
Có. Plugin tự động thêm LIMIT và OFFSET vào câu query khi người dùng chuyển trang trên giao diện. Câu SQL gốc được wrap thành subquery:
sql
SELECT * FROM (<câu SQL gốc>) AS collection_name
LIMIT 20 OFFSET 0Có thể dùng WITH (CTE) không?
Có. Plugin hỗ trợ phân tích WITH clause. Các bảng trong CTE được xử lý như nguồn dữ liệu bổ sung khi suy luận trường. Ví dụ:
sql
WITH active_users AS (
SELECT id, nickname FROM users WHERE status = 'active'
)
SELECT au.id, au.nickname, COUNT(o.id) AS order_count
FROM active_users au
LEFT JOIN orders o ON au.id = o.user_id
GROUP BY au.id, au.nicknameBảo mật
Những câu SQL nào bị từ chối?
Plugin chặn hai loại:
- Câu lệnh không phải SELECT:
INSERT,UPDATE,DELETE,DROP,ALTER,CREATE... đều bị từ chối ngay lập tức - Từ khóa nguy hiểm: Các hàm có thể gây hại cho hệ thống như
pg_read_file,pg_terminate_backend,LOAD_FILE,BENCHMARK... sẽ bị phát hiện và chặn
Admin có thể thực thi SQL bất kỳ không?
Chỉ admin có quyền pm.data-source-manager.collection-sql mới có thể tạo và thực thi SQL Collection. Tuy nhiên, ngay cả admin cũng bị giới hạn bởi cơ chế checkSQL() — không thể thực thi câu lệnh ghi hoặc gọi hàm nguy hiểm.
SQL chạy với quyền database nào?
SQL chạy với quyền của user database mà Digiforce đang dùng (thông tin trong biến môi trường DB_USER). Nên tạo user database riêng cho Digiforce với quyền tối thiểu cần thiết.
Cấu hình và quản lý
Làm sao chỉnh sửa SQL sau khi tạo?
Sử dụng action sqlCollection:update. Trên giao diện, vào cấu hình collection, chỉnh sửa SQL và danh sách trường, sau đó nhấn Save. Plugin sẽ:
- Cập nhật SQL và trường trong transaction
- Xóa các trường không còn tồn tại
- Tải lại collection với cấu hình mới
Xóa SQL Collection có ảnh hưởng dữ liệu gốc không?
Không. SQL Collection là ảo — không tạo bảng thực trong database. Khi xóa, chỉ metadata (tên collection, cấu hình SQL, danh sách trường) bị xóa. Dữ liệu trong các bảng nguồn không bị ảnh hưởng.
Có thể tạo quan hệ (relation) với SQL Collection không?
Không khuyến nghị. SQL Collection không tạo bảng thực nên không hỗ trợ foreign key. Nếu cần hiển thị dữ liệu liên quan, hãy viết JOIN trực tiếp trong câu SQL.
Lỗi thường gặp
Lỗi "Only supports SELECT statements or WITH clauses"
Nguyên nhân: Câu SQL không bắt đầu bằng SELECT hoặc WITH.
Cách xử lý: Kiểm tra lại câu SQL. Đảm bảo chỉ dùng SELECT hoặc WITH ... SELECT. Không được dùng INSERT, UPDATE, DELETE, CREATE TABLE...
Lỗi "SQL statements contain dangerous keywords"
Nguyên nhân: SQL chứa một trong các hàm bị cấm (ví dụ pg_sleep, LOAD_FILE).
Cách xử lý: Xóa hoặc thay thế hàm bị cấm. Nếu bạn thực sự cần dùng hàm đó, hãy tạo view ở tầng database và query từ view.
Lỗi "syntax error" khi tạo SQL Collection
Nguyên nhân: Cú pháp SQL không hợp lệ cho database hiện tại.
Cách xử lý:
- Thử chạy SQL trực tiếp trên database client (pgAdmin, DBeaver, mysql cli)
- Kiểm tra dialect (PostgreSQL vs MySQL vs SQLite) — cú pháp có thể khác nhau
- Đảm bảo tên bảng và cột đúng chính tả
Preview hiển thị nhưng trường không có kiểu dữ liệu
Nguyên nhân: Plugin không tìm thấy collection tương ứng với bảng trong SQL, hoặc cột là kết quả tính toán.
Cách xử lý: Sau khi tạo SQL Collection, vào cấu hình trường và gán interface/kiểu dữ liệu thủ công cho các trường cần thiết.