Tag Archive Naming Convention

Byphunsanit

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_by_my_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;