ระบบฐานข้อมูลทุกตัวมีกลไกการจัดการสิทธิ์ (Permissions) และ Privileges เพื่อควบคุมว่าผู้ใช้คนใดสามารถทำอะไรกับข้อมูลได้บ้าง การตั้งค่าสิทธิ์ที่ถูกต้องเป็นหัวใจสำคัญของการรักษาความปลอดภัย เพราะถ้าผู้ใช้ทุกคนมีสิทธิ์เต็มที่ ความเสี่ยงที่ข้อมูลจะถูกลบ แก้ไข หรือรั่วไหลก็สูงตามไปด้วย
บทความนี้จะอธิบายแนวคิดเรื่อง Permissions และ Privileges ในฐานข้อมูลยอดนิยมทั้ง MySQL/MariaDB และ PostgreSQL ครอบคลุมตั้งแต่พื้นฐานจนถึงการตั้งค่าในระดับ Production พร้อมตัวอย่างคำสั่งที่ใช้งานได้จริง
ทำความเข้าใจ Permissions และ Privileges
คำว่า Permissions และ Privileges ในบริบทฐานข้อมูลมีความหมายคล้ายกัน โดย Privileges หมายถึงสิทธิ์เฉพาะที่กำหนดให้ผู้ใช้สามารถทำการกระทำ (Action) บางอย่างกับวัตถุ (Object) ในฐานข้อมูลได้ เช่น สิทธิ์ SELECT ให้อ่านข้อมูลจากตาราง สิทธิ์ INSERT ให้เพิ่มข้อมูล หรือสิทธิ์ DROP ให้ลบตารางทิ้ง
หลักการสำคัญในการจัดการสิทธิ์คือ Principle of Least Privilege หมายถึงให้สิทธิ์เท่าที่จำเป็นต่อการทำงานเท่านั้น ไม่ให้มากกว่านั้น ตัวอย่างเช่น แอปพลิเคชันที่ต้องการแค่อ่านและเขียนข้อมูล ก็ไม่ควรได้สิทธิ์ DROP TABLE หรือ CREATE USER
ประเภทของ Privileges
Privileges แบ่งออกเป็นหลายระดับตามขอบเขตการทำงาน ฐานข้อมูลส่วนใหญ่แบ่งออกเป็น 3 ระดับหลัก ได้แก่ Global Level ที่มีผลกับทุกฐานข้อมูลในเซิร์ฟเวอร์ Database Level ที่มีผลเฉพาะฐานข้อมูลที่กำหนด และ Object Level ที่มีผลเฉพาะตาราง คอลัมน์ หรือ View ที่ระบุ
Data Manipulation Privileges
เป็นสิทธิ์ที่ใช้บ่อยที่สุดในการทำงานกับข้อมูล ได้แก่ SELECT สำหรับอ่านข้อมูล, INSERT สำหรับเพิ่มข้อมูลใหม่, UPDATE สำหรับแก้ไขข้อมูลที่มีอยู่, DELETE สำหรับลบข้อมูล และ EXECUTE สำหรับเรียกใช้ Stored Procedure
Data Definition Privileges
เป็นสิทธิ์สำหรับจัดการโครงสร้างฐานข้อมูล ได้แก่ CREATE สำหรับสร้างตาราง ฐานข้อมูล หรือ Index ใหม่, ALTER สำหรับเปลี่ยนแปลงโครงสร้างตาราง, DROP สำหรับลบตารางหรือฐานข้อมูล และ INDEX สำหรับสร้างหรือลบ Index
Administrative Privileges
เป็นสิทธิ์ระดับสูงสำหรับการบริหารจัดการ ได้แก่ CREATE USER สำหรับสร้างผู้ใช้ใหม่, GRANT OPTION สำหรับมอบสิทธิ์ให้ผู้ใช้คนอื่น, RELOAD สำหรับรีโหลดตารางสิทธิ์ และ SHUTDOWN สำหรับปิดเซิร์ฟเวอร์ สิทธิ์เหล่านี้ควรให้เฉพาะ DBA เท่านั้น
การจัดการสิทธิ์ใน MySQL / MariaDB
MySQL และ MariaDB ใช้ระบบ Grant Table ในฐานข้อมูล mysql เก็บข้อมูลสิทธิ์ทั้งหมด คำสั่งหลักที่ใช้คือ GRANT สำหรับให้สิทธิ์ และ REVOKE สำหรับถอนสิทธิ์
สร้าง User และกำหนดสิทธิ์
# เชื่อมต่อ MySQL ด้วย root
mysql -u root -p
# สร้าง User ใหม่
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'SecurePass123!';
# สร้าง User ที่เชื่อมต่อจาก IP เฉพาะ
CREATE USER 'appuser'@'10.0.0.5' IDENTIFIED BY 'SecurePass123!';
# สร้าง User ที่เชื่อมต่อได้จากทุก Host (ไม่แนะนำใน Production)
CREATE USER 'appuser'@'%' IDENTIFIED BY 'SecurePass123!';
# ตั้ง Password Policy (MySQL 8.0+)
ALTER USER 'appuser'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
ALTER USER 'appuser'@'localhost' FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LOCK_TIME 1;
GRANT — ให้สิทธิ์
# ให้สิทธิ์ SELECT, INSERT, UPDATE บนฐานข้อมูล myapp
GRANT SELECT, INSERT, UPDATE ON myapp.* TO 'appuser'@'localhost';
# ให้สิทธิ์ทุกอย่างบนฐานข้อมูลเดียว
GRANT ALL PRIVILEGES ON myapp.* TO 'admin_app'@'localhost';
# ให้สิทธิ์เฉพาะตาราง
GRANT SELECT ON myapp.products TO 'reporter'@'localhost';
# ให้สิทธิ์เฉพาะคอลัมน์
GRANT SELECT (id, name, email) ON myapp.users TO 'support'@'localhost';
# ให้สิทธิ์พร้อม GRANT OPTION (มอบสิทธิ์ต่อได้)
GRANT SELECT, INSERT ON myapp.* TO 'team_lead'@'localhost' WITH GRANT OPTION;
# ให้สิทธิ์ Global (ทุกฐานข้อมูล) — ใช้อย่างระมัดระวัง
GRANT ALL PRIVILEGES ON *.* TO 'dba'@'localhost' WITH GRANT OPTION;
# Apply การเปลี่ยนแปลง
FLUSH PRIVILEGES;
REVOKE — ถอนสิทธิ์
# ถอนสิทธิ์ DELETE
REVOKE DELETE ON myapp.* FROM 'appuser'@'localhost';
# ถอนสิทธิ์ทั้งหมด
REVOKE ALL PRIVILEGES ON myapp.* FROM 'appuser'@'localhost';
# ถอน GRANT OPTION
REVOKE GRANT OPTION ON myapp.* FROM 'team_lead'@'localhost';
FLUSH PRIVILEGES;
ตรวจสอบสิทธิ์
# ดูสิทธิ์ของ User
SHOW GRANTS FOR 'appuser'@'localhost';
# ดูสิทธิ์ของตัวเอง
SHOW GRANTS;
# ดูรายชื่อ User ทั้งหมด
SELECT user, host, account_locked FROM mysql.user;
# ดูสิทธิ์ระดับ Database
SELECT * FROM mysql.db WHERE user = 'appuser'\G
# ดูสิทธิ์ระดับ Table
SELECT * FROM mysql.tables_priv WHERE user = 'appuser'\G
# ดูสิทธิ์ระดับ Column
SELECT * FROM mysql.columns_priv WHERE user = 'appuser'\G
การจัดการสิทธิ์ใน PostgreSQL
PostgreSQL มีระบบสิทธิ์ที่ละเอียดกว่า MySQL โดยใช้ Roles เป็นหลัก ซึ่ง Role สามารถเป็นได้ทั้ง User (Login Role) และ Group (Role ที่ไม่ Login แต่ใช้รวมสิทธิ์) ทำให้การจัดการสิทธิ์ยืดหยุ่นมากขึ้น
สร้าง Role และ User
# เชื่อมต่อ PostgreSQL
psql -U postgres
# สร้าง Login Role (User)
CREATE ROLE appuser WITH LOGIN PASSWORD 'SecurePass123!';
# สร้าง Role พร้อมตั้งค่าเพิ่มเติม
CREATE ROLE appuser WITH
LOGIN
PASSWORD 'SecurePass123!'
VALID UNTIL '2027-01-01'
CONNECTION LIMIT 10;
# สร้าง Group Role (ไม่ Login)
CREATE ROLE readonly_group;
CREATE ROLE readwrite_group;
# เพิ่ม User เข้า Group
GRANT readonly_group TO appuser;
# สร้าง Superuser (เฉพาะ DBA เท่านั้น)
CREATE ROLE dba WITH LOGIN PASSWORD 'DBAPass123!' SUPERUSER;
GRANT — ให้สิทธิ์
# ให้สิทธิ์เชื่อมต่อฐานข้อมูล
GRANT CONNECT ON DATABASE myapp TO appuser;
# ให้สิทธิ์ใช้งาน Schema
GRANT USAGE ON SCHEMA public TO appuser;
# ให้สิทธิ์ SELECT, INSERT, UPDATE บนตารางทั้งหมดใน Schema
GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA public TO appuser;
# ให้สิทธิ์กับตารางที่สร้างในอนาคตด้วย
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT, INSERT, UPDATE ON TABLES TO appuser;
# ให้สิทธิ์เฉพาะตาราง
GRANT SELECT ON products TO reporter;
# ให้สิทธิ์เฉพาะคอลัมน์
GRANT SELECT (id, name, email) ON users TO support;
# ให้สิทธิ์ใช้ Sequence (จำเป็นสำหรับ INSERT ที่มี Auto-increment)
GRANT USAGE ON ALL SEQUENCES IN SCHEMA public TO appuser;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT USAGE ON SEQUENCES TO appuser;
# ให้สิทธิ์ EXECUTE บน Function
GRANT EXECUTE ON FUNCTION calculate_total(integer) TO appuser;
REVOKE — ถอนสิทธิ์
# ถอนสิทธิ์ DELETE
REVOKE DELETE ON ALL TABLES IN SCHEMA public FROM appuser;
# ถอนสิทธิ์ทั้งหมดจากตาราง
REVOKE ALL PRIVILEGES ON products FROM appuser;
# ถอนสิทธิ์เชื่อมต่อ
REVOKE CONNECT ON DATABASE myapp FROM appuser;
# ถอน User ออกจาก Group
REVOKE readonly_group FROM appuser;
ตรวจสอบสิทธิ์
# ดู Roles ทั้งหมด
\du
# ดูสิทธิ์บนตาราง
\dp products
# ดูสิทธิ์ทุกตารางใน Schema
SELECT grantee, table_name, privilege_type
FROM information_schema.role_table_grants
WHERE grantee = 'appuser'
ORDER BY table_name;
# ดูสิทธิ์ระดับ Database
SELECT datname, datacl FROM pg_database WHERE datname = 'myapp';
# ดูสมาชิกใน Group Role
SELECT r.rolname AS role, m.rolname AS member
FROM pg_auth_members am
JOIN pg_roles r ON r.oid = am.roleid
JOIN pg_roles m ON m.oid = am.member
ORDER BY r.rolname;
Role-Based Access Control (RBAC)
แทนที่จะให้สิทธิ์กับ User แต่ละคนโดยตรง วิธีที่ดีกว่าคือสร้าง Role ตามหน้าที่แล้วเพิ่ม User เข้า Role ที่เหมาะสม แนวทางนี้เรียกว่า Role-Based Access Control (RBAC) ซึ่งง่ายต่อการจัดการเมื่อมี User จำนวนมาก
ตัวอย่าง RBAC ใน MySQL
# สร้าง Roles
CREATE ROLE 'app_read', 'app_write', 'app_admin';
# กำหนดสิทธิ์ให้แต่ละ Role
GRANT SELECT ON myapp.* TO 'app_read';
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'app_write';
GRANT ALL PRIVILEGES ON myapp.* TO 'app_admin';
# มอบ Role ให้ User
GRANT 'app_read' TO 'reporter'@'localhost';
GRANT 'app_write' TO 'appuser'@'localhost';
GRANT 'app_admin' TO 'dba'@'localhost';
# User ต้อง Activate Role ก่อนใช้งาน
SET DEFAULT ROLE 'app_write' TO 'appuser'@'localhost';
# หรือ Activate ทุก Role
SET DEFAULT ROLE ALL TO 'appuser'@'localhost';
ตัวอย่าง RBAC ใน PostgreSQL
# สร้าง Group Roles
CREATE ROLE app_read;
CREATE ROLE app_write;
CREATE ROLE app_admin;
# กำหนดสิทธิ์ให้ Group Roles
GRANT CONNECT ON DATABASE myapp TO app_read, app_write, app_admin;
GRANT USAGE ON SCHEMA public TO app_read, app_write, app_admin;
-- Read-only
GRANT SELECT ON ALL TABLES IN SCHEMA public TO app_read;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO app_read;
-- Read-Write
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_write;
GRANT USAGE ON ALL SEQUENCES IN SCHEMA public TO app_write;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO app_write;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT USAGE ON SEQUENCES TO app_write;
-- Admin
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO app_admin;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO app_admin;
# เพิ่ม User เข้า Group
GRANT app_read TO reporter;
GRANT app_write TO appuser;
GRANT app_admin TO dba;
Row-Level Security (PostgreSQL)
PostgreSQL มีฟีเจอร์ Row-Level Security (RLS) ที่ควบคุมการเข้าถึงข้อมูลในระดับแถว ทำให้สามารถกำหนดได้ว่า User แต่ละคนเห็นข้อมูลเฉพาะแถวที่เกี่ยวข้องกับตัวเองเท่านั้น ฟีเจอร์นี้เหมาะสำหรับระบบ Multi-tenant หรือระบบที่ข้อมูลต้องแบ่งตามสิทธิ์อย่างเข้มงวด
# เปิด RLS บนตาราง
ALTER TABLE orders ENABLE ROW LEVEL SECURITY;
# สร้าง Policy — User เห็นเฉพาะ Order ของตัวเอง
CREATE POLICY user_orders ON orders
FOR ALL
USING (user_id = current_setting('app.current_user_id')::integer);
# สร้าง Policy แยกตาม Action
-- SELECT: เห็นเฉพาะข้อมูลตัวเอง
CREATE POLICY select_own ON orders
FOR SELECT
USING (user_id = current_setting('app.current_user_id')::integer);
-- INSERT: เพิ่มได้เฉพาะข้อมูลที่ user_id ตรงกับตัวเอง
CREATE POLICY insert_own ON orders
FOR INSERT
WITH CHECK (user_id = current_setting('app.current_user_id')::integer);
# Admin เห็นทุกแถว
CREATE POLICY admin_all ON orders
FOR ALL
TO app_admin
USING (true);
# ใช้งาน — ตั้ง User ID ก่อน Query
SET app.current_user_id = '42';
SELECT * FROM orders; -- เห็นเฉพาะ orders ของ user_id = 42
View-Based Access Control
อีกวิธีที่นิยมคือใช้ View เป็นตัวกลางในการควบคุมสิทธิ์ แทนที่จะให้ User เข้าถึงตารางจริงโดยตรง ให้สร้าง View ที่กรองข้อมูลหรือซ่อนคอลัมน์ที่ไม่ต้องการแล้วให้สิทธิ์ User เข้าถึง View แทน
# MySQL: สร้าง View ที่ซ่อนข้อมูลสำคัญ
CREATE VIEW public_users AS
SELECT id, name, email, created_at
FROM users;
-- ไม่แสดง password_hash, phone, address
GRANT SELECT ON myapp.public_users TO 'support'@'localhost';
# PostgreSQL: View พร้อม Security Barrier
CREATE VIEW public_users WITH (security_barrier = true) AS
SELECT id, name, email, created_at
FROM users;
GRANT SELECT ON public_users TO support;
# View ที่กรองข้อมูลตาม Department
CREATE VIEW dept_orders AS
SELECT o.*
FROM orders o
JOIN employees e ON o.created_by = e.id
WHERE e.department = current_setting('app.department');
GRANT SELECT ON dept_orders TO app_read;
แนวปฏิบัติด้านความปลอดภัย
การจัดการสิทธิ์ที่ดีต้องอาศัยทั้งการตั้งค่าที่ถูกต้องและแนวปฏิบัติที่รัดกุม รายการต่อไปนี้เป็นสิ่งที่ควรทำในระบบ Production ทุกระบบ
Password Policy
# MySQL 8.0+ — ตั้งค่า Password Policy
# แก้ไข /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
validate_password.policy = STRONG
validate_password.length = 12
validate_password.mixed_case_count = 1
validate_password.number_count = 1
validate_password.special_char_count = 1
default_password_lifetime = 90
# PostgreSQL — ใช้ pg_hba.conf บังคับ Authentication Method
# /etc/postgresql/16/main/pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
local all postgres peer
host all all 127.0.0.1/32 scram-sha-256
host all all ::1/128 scram-sha-256
host myapp appuser 10.0.0.0/24 scram-sha-256
# PostgreSQL — ติดตั้ง Extension สำหรับ Password Policy
CREATE EXTENSION passwordcheck;
Audit สิทธิ์เป็นประจำ
# MySQL — หา User ที่มีสิทธิ์มากเกินไป
SELECT user, host FROM mysql.user
WHERE Super_priv = 'Y' OR Grant_priv = 'Y';
# หา User ที่มี Global Privileges
SELECT * FROM mysql.user
WHERE Select_priv = 'Y' AND user NOT IN ('root', 'mysql.sys');
# PostgreSQL — หา Superusers
SELECT rolname FROM pg_roles WHERE rolsuper = true;
# หา User ที่มี GRANT OPTION
SELECT grantor, grantee, table_name, privilege_type, is_grantable
FROM information_schema.role_table_grants
WHERE is_grantable = 'YES'
ORDER BY grantee;
# หา User ที่ไม่ได้ใช้งาน (PostgreSQL + pg_stat_statements)
SELECT usename, last_activity
FROM pg_stat_activity
WHERE state IS NULL
ORDER BY last_activity;
ลบ User ที่ไม่ใช้งาน
# MySQL — ลบ User
DROP USER 'olduser'@'localhost';
# PostgreSQL — ถอนสิทธิ์ก่อนลบ
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM olduser;
REVOKE ALL PRIVILEGES ON DATABASE myapp FROM olduser;
REASSIGN OWNED BY olduser TO postgres;
DROP OWNED BY olduser;
DROP ROLE olduser;
Privileges สำหรับ Application User
ในระบบ Production แอปพลิเคชันควรเชื่อมต่อฐานข้อมูลด้วย User ที่มีสิทธิ์จำกัด ไม่ใช่ root หรือ superuser ตัวอย่างด้านล่างเป็นแนวทางการตั้งค่าสิทธิ์สำหรับแอปพลิเคชันทั่วไป
# MySQL — Application User ที่เหมาะสม
CREATE USER 'webapp'@'10.0.0.%' IDENTIFIED BY 'SecureAppPass!';
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'webapp'@'10.0.0.%';
-- ไม่ให้สิทธิ์ DROP, ALTER, CREATE, GRANT
# MySQL — Migration User (ใช้ตอน Deploy เท่านั้น)
CREATE USER 'migrator'@'localhost' IDENTIFIED BY 'MigratePass!';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, DROP, INDEX, REFERENCES
ON myapp.* TO 'migrator'@'localhost';
-- Lock หลังใช้งานเสร็จ
ALTER USER 'migrator'@'localhost' ACCOUNT LOCK;
-- Unlock ตอนต้องใช้
ALTER USER 'migrator'@'localhost' ACCOUNT UNLOCK;
# PostgreSQL — Application User
CREATE ROLE webapp WITH LOGIN PASSWORD 'SecureAppPass!';
GRANT CONNECT ON DATABASE myapp TO webapp;
GRANT USAGE ON SCHEMA public TO webapp;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO webapp;
GRANT USAGE ON ALL SEQUENCES IN SCHEMA public TO webapp;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO webapp;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT USAGE ON SEQUENCES TO webapp;
# PostgreSQL — Migration User
CREATE ROLE migrator WITH LOGIN PASSWORD 'MigratePass!';
GRANT ALL PRIVILEGES ON DATABASE myapp TO migrator;
GRANT ALL PRIVILEGES ON SCHEMA public TO migrator;
-- Disable login หลังใช้งาน
ALTER ROLE migrator WITH NOLOGIN;
-- Enable login ตอนต้องใช้
ALTER ROLE migrator WITH LOGIN;
Connection String ที่ปลอดภัย
เมื่อตั้งค่าสิทธิ์เรียบร้อยแล้ว การเชื่อมต่อจากแอปพลิเคชันต้องปลอดภัยเช่นกัน ห้ามเก็บ Password ไว้ในโค้ดโดยตรง ควรใช้ Environment Variable หรือ Secret Manager แทน
# ✖ ห้าม — Password ในโค้ด
DATABASE_URL=mysql://root:password123@localhost:3306/myapp
# ✔ ถูก — ใช้ Environment Variable
# .env (ไม่ commit เข้า Git)
DB_HOST=localhost
DB_PORT=3306
DB_USER=webapp
DB_PASS=SecureAppPass!
DB_NAME=myapp
# Python — อ่านจาก Environment
import os
db_config = {
'host': os.environ['DB_HOST'],
'port': int(os.environ['DB_PORT']),
'user': os.environ['DB_USER'],
'password': os.environ['DB_PASS'],
'database': os.environ['DB_NAME'],
}
# Node.js — อ่านจาก Environment
const dbConfig = {
host: process.env.DB_HOST,
port: process.env.DB_PORT,
user: process.env.DB_USER,
password: process.env.DB_PASS,
database: process.env.DB_NAME,
};
# PostgreSQL — ใช้ SSL Connection
DATABASE_URL=postgresql://webapp:SecureAppPass!@localhost:5432/myapp?sslmode=require
สรุป
การจัดการ Permissions และ Privileges เป็นรากฐานสำคัญของความปลอดภัยในระบบฐานข้อมูล หลักการที่ต้องจำคือ Principle of Least Privilege ให้สิทธิ์เท่าที่จำเป็นเท่านั้น ใช้ RBAC เพื่อจัดกลุ่มสิทธิ์ให้ง่ายต่อการบริหาร ตรวจสอบสิทธิ์เป็นประจำ ลบ User ที่ไม่ใช้แล้ว และอย่าให้แอปพลิเคชันเชื่อมต่อด้วยสิทธิ์ root เด็ดขาด ไม่ว่าจะใช้ MySQL, MariaDB หรือ PostgreSQL หลักการเหล่านี้ใช้ได้เหมือนกัน
แนะนำบริการ DE
การรันฐานข้อมูลในระบบ Production ต้องการเซิร์ฟเวอร์ที่ควบคุมได้เต็มที่ ทั้งการสร้าง User การตั้งค่า Firewall และการจำกัดสิทธิ์เข้าถึง Cloud VPS ของ DE ให้ Root Access เต็มรูปแบบพร้อม SSD NVMe ที่รองรับ I/O ของฐานข้อมูลได้ดี เหมาะสำหรับติดตั้งและตั้งค่าสิทธิ์ตามแนวทางในบทความนี้
สำหรับโปรเจกต์ที่ใช้ฐานข้อมูลร่วมกับเว็บแอปพลิเคชันและไม่ต้องการจัดการเซิร์ฟเวอร์เอง Cloud Hosting ของ DE เป็นทางเลือกที่สะดวกพร้อม Managed Infrastructure ให้ใช้งานได้ทันที

