ป้ายกำกับ: กฏ

SQL Server: เช็ค table column ตามกฏSQL Server: เช็ค table column ตามกฏ

ส่วนหนึ่งของการออกแบบ database ใหญ่ ๆ ที่จะให้ column name ใน แต่ละ table มีชื่อที่สื่อความหมายและใช้ “ชื่อเดียวกัน” แล้ว ถ้าใช้พวก blameable (ติดตามว่าใครเป็นสร้างหรือแก้ข้อมูลใน record ของ table นั้น ๆ ) จะมีคอลัมน์ที่เหมือนกันในทุก ๆ ตารางเป็นกฏ เช่น จะมี column ‘id’, ‘created_by’, ‘created_date’, ‘deleted_by’, ‘deleted_date’, ‘updated_by’, ‘updated_date’ เป็นมาตราฐานตามกฏการใช้ library สำเร็จรูป
audit_table_structure_compliance.sql

WITH RequiredColumns AS (
 -- กำหนดรายการคอลัมน์มาตรฐานที่ต้องมี
 SELECT col FROM (VALUES 
  ('id'), 
  ('created_by'), 
  ('created_date'), 
  ('deleted_by'), 
  ('deleted_date'), 
  ('updated_by'), 
  ('updated_date')
 ) AS t(col)
),
TableList AS (
 -- ดึงรายชื่อตารางทั้งหมดที่ไม่ใช่ System Tables
 SELECT 
  t.object_id,
  s.name AS SchemaName,
  t.name AS TableName
 FROM sys.tables t
 INNER JOIN sys.schemas s ON t.schema_id = s.schema_id
 WHERE t.is_ms_shipped = 0 -- ไม่รวมตารางของระบบ
  AND t.name <> 'sysdiagrams'
),
CheckAudit AS (
 -- ตรวจสอบว่าในแต่ละตาราง มีคอลัมน์ไหนอยู่บ้าง
 SELECT 
  tl.SchemaName,
  tl.TableName,
  rc.col AS RequiredColumn,
  CASE WHEN c.column_id IS NOT NULL THEN 1 ELSE 0 END AS HasColumn
 FROM TableList tl
 CROSS JOIN RequiredColumns rc -- เอาตารางตั้งต้น x รายชื่อคอลัมน์ที่ต้องมี
 LEFT JOIN sys.columns c ON tl.object_id = c.object_id AND rc.col = c.name
)
SELECT 
 SchemaName,
 TableName,
 CASE 
  WHEN MIN(HasColumn) = 1 THEN 'PASS' 
  ELSE 'FAIL' 
 END AS Status,
 -- รวบรวมรายชื่อคอลัมน์ที่ขาด (Missing Columns)
 STUFF((
  SELECT ', ' + ca2.RequiredColumn
  FROM CheckAudit ca2
  WHERE ca2.SchemaName = ca.SchemaName 
   AND ca2.TableName = ca.TableName
   AND ca2.HasColumn = 0
  FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, ''
 ) AS MissingColumns
FROM CheckAudit ca
GROUP BY SchemaName, TableName
ORDER BY Status, SchemaName, TableName;

ถ้า lib ที่ใช้มี column ที่ต่างจากนี้ แก้แค่ ชื่อ column ในบรรทัด 4 – 10 ก็จะช่วยเช็คข้อมูลได้