카테고리 없음

MSSQL : DB간에 변경사항 체크하기

큰세상2000 2024. 12. 24. 05:59
반응형

 

By ChatGPT, Claude

 

DB 이전이나 DB서버 업그레이드하면서 자동으로 바뀌는 경우가 있습니다.

변경된 사항을 찾아서 알려줍니다.

 

 

-- 변수 선언
DECLARE @sourceDatabase NVARCHAR(50) = 'wowdb777'; -- 소스 데이터베이스 이름
DECLARE @targetDatabase NVARCHAR(50) = 'wowdb888';   -- 타겟 데이터베이스 이름
DECLARE @sourceLabel NVARCHAR(50) = '2008R2';        -- 소스 데이터베이스 멘트
DECLARE @targetLabel NVARCHAR(50) = '2022';          -- 타겟 데이터베이스 멘트

-- 데이터 타입 변경사항 확인
DECLARE @query NVARCHAR(MAX);
SET @query = '
SELECT 
    gg_old.TABLE_NAME AS ''Table Name'',
    gg_old.COLUMN_NAME AS ''Column Name'',
    gg_old.DATA_TYPE AS [' + @sourceLabel + '_Type],
    gg_new.DATA_TYPE AS [' + @targetLabel + '_Type],
    gg_old.CHARACTER_MAXIMUM_LENGTH AS [' + @sourceLabel + '_Length],
    gg_new.CHARACTER_MAXIMUM_LENGTH AS [' + @targetLabel + '_Length],
    gg_old.NUMERIC_PRECISION AS [' + @sourceLabel + '_Precision],
    gg_new.NUMERIC_PRECISION AS [' + @targetLabel + '_Precision]
FROM 
    [' + @sourceDatabase + '].INFORMATION_SCHEMA.COLUMNS gg_old
    LEFT JOIN [' + @targetDatabase + '].INFORMATION_SCHEMA.COLUMNS gg_new 
        ON gg_old.TABLE_NAME = gg_new.TABLE_NAME 
        AND gg_old.COLUMN_NAME = gg_new.COLUMN_NAME
WHERE 
    gg_old.DATA_TYPE != gg_new.DATA_TYPE 
    OR gg_old.CHARACTER_MAXIMUM_LENGTH != gg_new.CHARACTER_MAXIMUM_LENGTH
    OR gg_old.NUMERIC_PRECISION != gg_new.NUMERIC_PRECISION
ORDER BY 
    gg_old.TABLE_NAME, gg_old.COLUMN_NAME;

-- Stored Procedure changes
SELECT 
    gg_old.SPECIFIC_NAME AS ''Procedure Name'',
    gg_old.ROUTINE_DEFINITION AS [' + @sourceLabel + '_Definition],
    gg_new.ROUTINE_DEFINITION AS [' + @targetLabel + '_Definition]
FROM 
    [' + @sourceDatabase + '].INFORMATION_SCHEMA.ROUTINES gg_old
    LEFT JOIN [' + @targetDatabase + '].INFORMATION_SCHEMA.ROUTINES gg_new 
        ON gg_old.SPECIFIC_NAME = gg_new.SPECIFIC_NAME
WHERE 
    gg_old.ROUTINE_DEFINITION != gg_new.ROUTINE_DEFINITION
    AND gg_old.ROUTINE_TYPE = ''PROCEDURE''
ORDER BY 
    gg_old.SPECIFIC_NAME;

-- Function changes
SELECT 
    gg_old.SPECIFIC_NAME AS ''Function Name'',
    gg_old.ROUTINE_DEFINITION AS [' + @sourceLabel + '_Definition],
    gg_new.ROUTINE_DEFINITION AS [' + @targetLabel + '_Definition]
FROM 
    [' + @sourceDatabase + '].INFORMATION_SCHEMA.ROUTINES gg_old
    LEFT JOIN [' + @targetDatabase + '].INFORMATION_SCHEMA.ROUTINES gg_new 
        ON gg_old.SPECIFIC_NAME = gg_new.SPECIFIC_NAME
WHERE 
    gg_old.ROUTINE_DEFINITION != gg_new.ROUTINE_DEFINITION
    AND gg_old.ROUTINE_TYPE = ''FUNCTION''
ORDER BY 
    gg_old.SPECIFIC_NAME;

-- Missing indexes
SELECT 
    gg_old.TABLE_NAME AS ''Table Name'',
    gg_old.INDEX_NAME AS ''Index Name'',
    gg_old.COLUMN_NAME AS ''Column Name''
FROM 
    (SELECT 
        t.name AS TABLE_NAME,
        ind.name AS INDEX_NAME,
        col.name AS COLUMN_NAME
    FROM 
        [' + @sourceDatabase + '].sys.indexes ind 
        INNER JOIN [' + @sourceDatabase + '].sys.index_columns ic 
            ON ind.object_id = ic.object_id and ind.index_id = ic.index_id
        INNER JOIN [' + @sourceDatabase + '].sys.columns col 
            ON ic.object_id = col.object_id and ic.column_id = col.column_id
        INNER JOIN [' + @sourceDatabase + '].sys.tables t 
            ON ind.object_id = t.object_id) gg_old
    LEFT JOIN 
    (SELECT 
        t.name AS TABLE_NAME,
        ind.name AS INDEX_NAME,
        col.name AS COLUMN_NAME
    FROM 
        [' + @targetDatabase + '].sys.indexes ind 
        INNER JOIN [' + @targetDatabase + '].sys.index_columns ic 
            ON ind.object_id = ic.object_id and ind.index_id = ic.index_id
        INNER JOIN [' + @targetDatabase + '].sys.columns col 
            ON ic.object_id = col.object_id and ic.column_id = col.column_id
        INNER JOIN [' + @targetDatabase + '].sys.tables t 
            ON ind.object_id = t.object_id) gg_new
    ON gg_old.TABLE_NAME = gg_new.TABLE_NAME 
    AND gg_old.INDEX_NAME = gg_new.INDEX_NAME
WHERE 
    gg_new.INDEX_NAME IS NULL
ORDER BY 
    gg_old.TABLE_NAME, gg_old.INDEX_NAME;
';

-- Execute
EXEC sp_executesql @query;

반응형