PlusMagi's Blog By Pitt Phunsanit Database SQL Server: batch migrate sync table

SQL Server: batch migrate sync table

ในโลกของการพัฒนาซอฟต์แวร์ที่ต้องมีการ deploy และอัปเดตฐานข้อมูลอย่างต่อเนื่อง การเปลี่ยนแปลงโครงสร้างตาราง (Schema Migration) เป็นกระบวนการที่ซับซ้อนและเสี่ยงต่อข้อผิดพลาดสูง โดยเฉพาะเมื่อต้องทำการแก้ไขในหลาย ๆ ฐานข้อมูล (Dev, QA, Prod) หรือต้องแก้ไขตารางที่มีความสัมพันธ์กันหลายจุด

ปัญหาที่พบบ่อยคือการที่นักพัฒนาหลายคนเข้ามาแก้ไข Schema ในส่วนต่าง ๆ ทำให้เกิดความไม่สอดคล้อง (Schema Drift) และการไล่แก้ไขด้วยมือเป็นเรื่องที่แทบจะเป็นไปไม่ได้ บทความนี้จะนำเสนอแนวคิดและโครงสร้างสคริปต์สำหรับใช้ในการทำ Batch Migrate และ Synchronize Table Schema อย่างเป็นระบบ โดยเน้นการใช้ภาษา PostgreSQL ซึ่งเป็นระบบที่ทรงพลังในการจัดการงานระดับสถาปัตยกรรม

💡 หลักการทำงานของ Batch Schema Synchronization

แทนที่จะเขียนคำสั่ง ALTER TABLE ทีละคำสั่งสำหรับทุก ๆ ฐานข้อมูลและทุก ๆ ตาราง เราจะใช้หลักการของ Metadata-Driven Migration ซึ่งหมายถึงการสร้างสคริปต์หลักที่ทำหน้าที่ดังนี้:

  1. Configuration: กำหนดรายการตารางและ Schema ที่ต้องการซิงค์
  2. Metadata Extraction: เชื่อมต่อกับฐานข้อมูลต้นทางและปลายทาง (หรือใช้ข้อมูลอ้างอิง) เพื่อดึงข้อมูลโครงสร้างตาราง (ชื่อคอลัมน์, ชนิดข้อมูล, Nullability, Description)
  3. Comparison Logic: เปรียบเทียบ Metadata ที่ดึงมากับโครงสร้างปัจจุบันของตารางเป้าหมาย
  4. Dynamic Execution: สร้างคำสั่ง SQL ที่จำเป็น (เช่น ALTER TABLE ADD COLUMN, ALTER TABLE MODIFY COLUMN, ADD CONSTRAINT) แบบไดนามิก แล้วรันคำสั่งเหล่านั้นเป็นชุด (Batch)

⚙️ ตัวอย่างการใช้ PL/pgSQL สำหรับ Batch Migration

เราจะใช้ภาษา PL/pgSQL ของ PostgreSQL เพื่อสร้าง Stored Procedure ที่สามารถวนลูป (Loop) ตรวจสอบและปรับโครงสร้างตารางได้โดยอัตโนมัติ ตัวอย่างนี้แสดงการตรวจสอบและเพิ่มคอลัมน์ที่ขาดหายไป:

SQL

-- PostgreSQL PL/pgSQL Example for Schema Sync

DO $$
DECLARE
    v_schema_name CONSTANT TEXT := 'public';
    v_table_name CONSTANT TEXT := 'user_profile';
    v_column_to_add CONSTANT TEXT := 'is_active';
    v_data_type CONSTANT TEXT := 'boolean';
BEGIN
    -- 1. ตรวจสอบว่าคอลัมน์นี้มีอยู่แล้วหรือไม่
    IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = v_schema_name AND table_name = v_table_name AND column_name = v_column_to_add)
    THEN
        -- 2. ถ้าไม่มี ให้สร้างคำสั่ง ALTER TABLE
        RAISE NOTICE 'Column % not found. Executing ADD COLUMN.', v_column_to_add;
        EXECUTE format('ALTER TABLE %I.%I ADD COLUMN %I %s DEFAULT FALSE;', v_schema_name, v_table_name, v_column_to_add, v_data_type);
    ELSE
        RAISE NOTICE 'Column % already exists. Skipping.', v_column_to_add;
    END IF;
END;
$$ LANGUAGE plpgsql;

🚀 ประโยชน์ในเชิงสถาปัตยกรรม (Architectural Benefits)

การใช้แนวทาง Batch Migration ด้วย PostgreSQL Stored Procedure ไม่เพียงแต่ช่วยลดเวลาในการทำงานเท่านั้น แต่ยังช่วยเพิ่มความน่าเชื่อถือของระบบ (Reliability) อย่างมาก เนื่องจาก:

  • Consistency: รับประกันว่าทุกสภาพแวดล้อม (Dev/QA/Prod) จะมี Schema ที่เป็นมาตรฐานเดียวกัน
  • Auditability: ทุกการเปลี่ยนแปลงจะถูกบันทึกและควบคุมผ่านสคริปต์เดียว ทำให้ง่ายต่อการตรวจสอบย้อนหลัง
  • Maintainability: หากมีการเปลี่ยนแปลงโครงสร้างในอนาคต เพียงแค่แก้ไข Configuration ในสคริปต์หลัก ไม่ต้องเขียนโค้ด SQL ใหม่ทั้งหมด

✅ บทสรุป

การจัดการ Schema Migration ด้วยเครื่องมือที่เหมาะสมและเป็นระบบอย่าง PostgreSQL PL/pgSQL ไม่ใช่แค่การลดงานที่ต้องทำด้วยมือ แต่เป็นการยกระดับกระบวนการพัฒนาซอฟต์แวร์ให้เป็นไปตามมาตรฐานระดับ Senior Architect การใช้แนวคิด Metadata-Driven Migration ทำให้ทีมสามารถทำงานได้อย่างรวดเร็ว ปลอดภัย และมั่นใจได้ว่าฐานข้อมูลของระบบจะมีความสอดคล้องในทุกสภาพแวดล้อมการทำงาน