วัน: 31 ธันวาคม 2017

SQL Server: มันโดนแก้ตอนไหนSQL Server: มันโดนแก้ตอนไหน

การตรวจสอบว่า Object ต่าง ๆ ใน Database เช่น Table, Stored Procedure, หรือ View ถูกสร้างหรือแก้ไขล่าสุดเมื่อไหร่ เป็นเรื่องสำคัญมากในการดูแลระบบ (Database Administration) หรือการไล่เช็ก Code (Debugging) เพื่อดูว่ามีการเปลี่ยนแปลงอะไรเกิดขึ้นบ้างในช่วงที่ผ่านมา นี่คือวิธีการเขียน Query ใน SQL Server เพื่อดึงข้อมูลเหล่านี้ออกมาครับ


การดึงข้อมูล Object ทั้งหมดเรียงตามวันที่แก้ไขล่าสุด

เราจะใช้ System View ที่ชื่อว่า sys.objects ซึ่งเก็บรวบรวม Object ทุกประเภทที่อยู่ใน Database นั้น ๆ audit_object_modified.sql

SELECT name AS [ObjectName], type_desc AS [ObjectType], create_date AS [DateCreated], modify_date AS [LastModified]
FROM sys.objects
-- Table (U) , Procedure (P) , View (V) และ Function (FN) WHERE type IN ('FN', 'P', 'TR', 'U', 'V') ORDER BY modify_date DESC;

คำอธิบายคอลัมน์

  • create_date: วันที่ Object นั้นถูกสร้างขึ้นครั้งแรก
  • modify_date: วันที่ Object นั้นถูกเปลี่ยนแปลงโครงสร้าง (เช่น ใช้คำสั่ง ALTER)
  • type_desc: บอกประเภทของ Object เช่น USER_TABLE, SQL_STORED_PROCEDURE

เจาะจงเฉพาะ “Table” ที่เพิ่งสร้างหรือแก้ไข

หากคุณต้องการดูเฉพาะรายชื่อตาราง เพื่อตรวจสอบว่ามีใครแอบไปเพิ่ม Column หรือเปลี่ยน Data Type หรือไม่ ให้ใช้ sys.tables แทน
audit_tables_modified.sql

SELECT name AS [TableName], create_date, modify_date
FROM sys.tables
ORDER BY modify_date DESC;

ข้อควรระวัง: modify_date จะเปลี่ยนก็ต่อเมื่อมีการแก้ไข Structure เท่านั้น เช่น การเพิ่ม Column หรือเปลี่ยนชื่อตาราง แต่ถ้าเป็นการ INSERT / UPDATE ข้อมูลภายในตาราง วันที่นี้จะไม่เปลี่ยนครับ


การค้นหา Object ที่แก้ไขภายใน X วันที่ผ่านมา

หาก Database มีขนาดใหญ่มาก การไล่ดูทั้งหมดอาจจะยาก คุณสามารถใส่เงื่อนไข WHERE เพื่อดูเฉพาะสิ่งที่เกิดขึ้นเร็ว ๆ นี้ได้ เช่น 15 วันที่ผ่านมา
audit_tables_modified.sql

SELECT name AS [TableName], create_date, modify_date
FROM sys.tables
WHERE modify_date >= DATEADD (day, -15, GETDATE ()) ORDER BY modify_date DESC;


สรุปเทคนิคการใช้งาน

  1. สำหรับการ Debug: หากเกิด Error ในระบบกะทันหัน ให้รัน Query นี้เพื่อดูว่ามีใครไป ALTER หรือแก้ไข Procedure / Table ตัวไหนในช่วงเวลานั้นหรือไม่
  2. การจัดกลุ่ม: คุณสามารถเพิ่ม GROUP BY type_desc หากต้องการนับจำนวน Object ที่ถูกสร้างในแต่ละประเภท
  3. ความแม่นยำ: หากมีการ Restore Database หรือย้ายเครื่อง วันที่เหล่านี้อาจจะเปลี่ยนไปตามเวลาที่ทำการ Import เข้าเครื่องใหม่

อ่านเพิ่มเติม