SQL Server/SQL Server Tip

변경된 테이블 이름 복구하기

SungWookKang 2015. 7. 23. 09:35
반응형

변경된 테이블 이름 복구하기

 

  • Version : SQL Server 2008, 2008R2, 2012

 

실수로 테이블 이름을 변경 하였다. 어떻게 복구 할까?

 

이번 시간에는 실수로 변경한 테이블 이름을 복구하는 방법을 살펴본다. 백업 본이 있으면 기존의 백업 본을 보고 테이블 이름을 찾을 수 있지만 백업이 없거나 라이브 중인 경우에는 다음과 같은 방법을 사용 할 수 있다. (물론 방금 수정한 테이블의 이름은 기억력으로 다시 되돌려 놓으면 된다. 하지만 내가 모르는 수정이 발생 하였을 경우 매우 유용할 듯 하다.)

 

변경된 이름을 찾는 방법은 트랜잭션 로그에서 변경 된 사항을 찾아서 이전의 테이블 이름과 변경 된 테이블 이름을 찾는 것이다.

DECLARE

@Date_From DATETIME='1900/01/01',

@Date_To DATETIME ='9999/12/31'

 

Select

    S.type_desc As [Object Type],

    REPLACE(Substring(A.[RowLog Contents 0] ,14,LEN(A.[RowLog Contents 0])),0x00,0x) as [Object Name Before Rename],

    REPLACE(Substring(B.[RowLog Contents 0] ,14,LEN(B.[RowLog Contents 0])),0x00,0x) as [Object Name After Rename]

FROM sys.fn_dblog(NULL, NULL) A

    Inner Join sys.fn_dblog(NULL, NULL) B

        On A.[Transaction ID]=B.[Transaction ID] And A.AllocUnitId = B.AllocUnitId

    Left Join sys.objects S

        On CONVERT(BIGINT,CONVERT(VARBINARY(MAX) ,REVERSE(Substring(A.[RowLog Contents 0],7,4))))=S.object_id

WHERE A.AllocUnitId IN (562949955649536)

    AND A.Context IN ('LCX_MARK_AS_GHOST')

    AND A.Operation IN ('LOP_DELETE_ROWS')

    AND B.Context IN ('LCX_INDEX_LEAF')

    AND B.Operation IN ('LOP_INSERT_ROWS')

/*Use this subquery to filter the date*/

    AND A.[TRANSACTION ID] IN (SELECT DISTINCT [TRANSACTION ID] FROM sys.fn_dblog(NULL, NULL) WHERE Context IN ('LCX_NULL') AND Operation IN ('LOP_BEGIN_XACT') AND [Transaction Name]='user_transaction' AND CONVERT(NVARCHAR(11),[Begin Time]) BETWEEN @Date_From AND @Date_To)

GO

 

 

 

참고자료에서는 데이터 값이 잘 나타나는데 필자가 실습한 내용에서는 정상적인 데이터가 나타나지 않는다. SQL 2008, 2008R2, 2012에서 실습한 결과 아래 그림과 같았다. (문제 해결 후 포스트 수정 예정)

 

 

[참고자료]

http://raresql.com/2013/12/24/sql-server-how-to-recover-the-accidentally-renamed-object-name/

 

2013-12-31 / 강성욱 / http://sqlmvp.kr

 

반응형