วัน: 11 กรกฎาคม 2020

SQL Server: index, constraint ชื่อนี้ตั้งเองSQL Server: index, constraint ชื่อนี้ตั้งเอง

คุณสามารถใช้ Query ตรวจสอบ Default Constraints ที่ “ไม่ได้ถูกตั้งชื่อโดยระบบ SSMS” (SSMS-generated) เพราะโดยปกติแล้ว ถ้า SSMS สร้าง Default Constraint ให้เอง (เช่น สร้างผ่าน Table Designer) ชื่อของมันจะมี Suffix เป็นแฮชแบบสุ่ม และในตาราง sys.default_constraints จะมี Flag is_system_named เป็น 1 (True) ดังนั้น Query ที่จะหาชื่อที่คุณ “สร้างเอง” หรือ “ตั้งชื่อผิด” (คือไม่ได้ให้ระบบตั้ง) จะใช้การค้นหา
is_system_named = 1 คือ Constraint ที่ถูกตั้งชื่อโดยระบบ (System-named)
is_system_named = 0 คือ Constraint ที่ถูกตั้งชื่อโดยผู้ใช้ (User-named) ซึ่งหมายความว่า “ไม่เป็นไปตาม” มาตรฐานที่ SSMS หรือระบบสร้างให้
find_index_constraint_not_gennarate_naming_convention_not_your_name.sql

/*
-- 1. Primary Keys & Unique Constraints
*/
SELECT
 s.name AS SchemaName,
 t.name AS TableName,
 kc.name AS ObjectName,
 kc.type_desc AS ObjectType, -- 'PRIMARY_KEY_CONSTRAINT' or 'UNIQUE_CONSTRAINT'
 NULL AS RelatedColumn,
 NULL AS Definition
FROM
 sys.key_constraints AS kc
INNER JOIN
 sys.tables AS t ON kc.parent_object_id = t.object_id
INNER JOIN
 sys.schemas AS s ON t.schema_id = s.schema_id
WHERE
 kc.is_system_named = 0

UNION ALL

/*
-- 2. Foreign Keys
*/
SELECT
 s.name AS SchemaName,
 t.name AS TableName,
 fk.name AS ObjectName,
 'FOREIGN_KEY_CONSTRAINT' AS ObjectType,
 NULL AS RelatedColumn, -- FKs can span multiple columns
 NULL AS Definition
FROM
 sys.foreign_keys AS fk
INNER JOIN
 sys.tables AS t ON fk.parent_object_id = t.object_id
INNER JOIN
 sys.schemas AS s ON t.schema_id = s.schema_id
WHERE
 fk.is_system_named = 0

UNION ALL

/*
-- 3. Check Constraints
*/
SELECT
 s.name AS SchemaName,
 t.name AS TableName,
 cc.name AS ObjectName,
 'CHECK_CONSTRAINT' AS ObjectType,
 c.name AS RelatedColumn, -- Column name if it's a column-level check
 cc.definition AS Definition
FROM
 sys.check_constraints AS cc
INNER JOIN
 sys.tables AS t ON cc.parent_object_id = t.object_id
INNER JOIN
 sys.schemas AS s ON t.schema_id = s.schema_id
LEFT JOIN
 sys.columns AS c ON cc.parent_object_id = c.object_id AND cc.parent_column_id = c.column_id
WHERE
 cc.is_system_named = 0

UNION ALL

/*
-- 4. Default Constraints (From your original query) */
SELECT
 s.name AS SchemaName,
 t.name AS TableName,
 dc.name AS ObjectName,
 'DEFAULT_CONSTRAINT' AS ObjectType,
 c.name AS RelatedColumn,
 dc.definition AS Definition
FROM
 sys.default_constraints AS dc
INNER JOIN
 sys.tables AS t ON dc.parent_object_id = t.object_id
INNER JOIN
 sys.schemas AS s ON t.schema_id = s.schema_id
INNER JOIN
 sys.columns AS c ON dc.parent_object_id = c.object_id AND dc.parent_column_id = c.column_id
WHERE
 dc.is_system_named = 0

ORDER BY
 SchemaName, TableName, ObjectType, ObjectName;