Tag Archive is_system_named

Byphunsanit

SQL Server: เปลี่ยนชื่อตาม naming convention

การตั้งชื่อ index, constraint SQL Server ตาม naming convention ที่ SSMS สร้างช่วยให้การจัดระเบียบ ให้ส่วนต่าง ๆ ใน database เป็นระเบียบได้ โดยได้เพิ่ม table filter ไว้อย่าง “PP_” เพราะว่าสร้างไว้แบบ ชื่อของฉัน ชื่อของคุณไว้เยอะมาก จนถ้าดูทีเดียวทั้ง database นี่ดูกันไม่ทัน
find_index_constraint_not_gennarate_naming_convention_not_your_name.sql

-- 1. ประกาศและตั้งค่าตัวแปรสำหรับกรองชื่อตาราง
DECLARE @TableNameFilter NVARCHAR(100);
SET @TableNameFilter = '%PP_%'; -- แก้ไขเงื่อนไขของคุณที่นี่ที่เดียว

-- 2. ใช้ Common Table Expression (CTE) เพื่อรวมผลลัพธ์
;WITH AllObjectsToRename AS (

    -- ส่วนที่ 1: ค้นหา Constraints (PK, FK, UQ, DF, CK) ที่ชื่อผิด
    SELECT
        s.name AS SchemaName
        t.name AS TableName,
        o.name AS OldName,
        o.type_desc AS ObjectType,

        (CASE o.type
            WHEN 'PK' THEN 'PK_' + t.name
            WHEN 'F'  THEN 'FK_' + t.name + '_' + o.name
            WHEN 'UQ' THEN 'UQ_' + t.name + '_' + o.name
            WHEN 'D'  THEN 'DF_' + t.name + '_' + o.name
            WHEN 'C'  THEN 'CK_' + t.name + '_' + o.name
            ELSE o.name
        END) AS ProposedNewName,

        'EXEC sp_rename N''' + QUOTENAME(s.name) + '.' + QUOTENAME(o.name) + ''', N''' +
        (CASE o.type
            WHEN 'PK' THEN 'PK_' + t.name
            WHEN 'F'  THEN 'FK_' + t.name + '_' + o.name
            WHEN 'UQ' THEN 'UQ_' + t.name + '_' + o.name
            WHEN 'D'  THEN 'DF_' + t.name + '_' + o.name
            WHEN 'C'  THEN 'CK_' + t.name + '_' + o.name
            ELSE o.name
        END)
        + ''', N''OBJECT'';' AS RenameScript
    FROM
        sys.objects AS o
    JOIN
        sys.tables AS t ON o.parent_object_id = t.object_id
    JOIN
        sys.schemas AS s ON t.schema_id = s.schema_id
    WHERE
        o.is_ms_shipped = 0
        AND o.type IN ('PK', 'F', 'UQ', 'D', 'C')
        AND t.name LIKE @TableNameFilter
        AND (
            (o.type = 'PK' AND o.name NOT LIKE 'PK_%') OR
            (o.type = 'F'  AND o.name NOT LIKE 'FK_%') OR
            (o.type = 'UQ' AND o.name NOT LIKE 'UQ_%') OR
            (o.type = 'D'  AND o.name NOT LIKE 'DF_%') OR
            (o.type = 'C'  AND o.name NOT LIKE 'CK_%')
        )

    UNION ALL

    -- ส่วนที่ 2: ค้นหา Indexes (IX) ที่ชื่อผิด
    SELECT
        s.name AS SchemaName,
        t.name AS TableName,
        i.name AS OldName,
        i.type_desc AS ObjectType,

        'IX_' + t.name + '_' + i.name AS ProposedNewName,

        'EXEC sp_rename N''' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) + '.' + QUOTENAME(i.name) + ''', N''' +
        'IX_' + t.name + '_' + i.name +
        ''', N''INDEX'';' AS RenameScript
    FROM
        sys.indexes AS i
    JOIN
        sys.tables AS t ON i.object_id = t.object_id
    JOIN
        sys.schemas AS s ON t.schema_id = s.schema_id
    WHERE
        i.is_primary_key = 0
        AND i.is_unique_constraint = 0
        AND i.type_desc != 'HEAP'
        AND t.is_ms_shipped = 0
        AND i.name IS NOT NULL
        AND t.name LIKE @TableNameFilter
        AND i.name NOT LIKE 'IX_%'
)
-- 3. สั่ง SELECT และ ORDER BY จาก CTE ด้านบน
SELECT
    SchemaName,
    TableName,
    OldName,
    ObjectType,
    ProposedNewName,
    RenameScript
FROM
    AllObjectsToRename
ORDER BY
    SchemaName, TableName, ObjectType, OldName;

ถ้าจะแก้จริง ๆ ให้แน่ใจว่า ชื่อนั้น ๆ ไม่ได้ fixed ไว้ใน code หัวจะปวด งานจะเข้า