스키마 변경이 어떻게 발생 했습니까?


21

어제 뭔가 나쁜 일이 일어났다.

얼마 전 만들어진보기는 ​​결국 보고서를 파기 한 누군가에 의해 수정되었습니다. 운수 나쁘게. 누군가 (의도적으로 또는 무의식적으로) PRODUCTION 데이터베이스에서이 수정을 수행했습니다.

내 질문 : 누가 (사용자 이름) 이이 수정을했는지 알 수있는 방법 (스크립트 / 소프트웨어 / 프리웨어 등)이 있습니까? 그래서 해당 사용자의 프로덕션 데이터베이스에 대한 액세스 권한을 취소 할 수 있습니다.

내 질문이 명확하지 않은 경우 의견을 말하십시오.

답변:


36

활성화되어 있고 "스키마 변경 내역"보고서에 표시되는 동안 롤오버되지 않는 한 기본 추적에 기록됩니다.

Management Studio에서이 데이터베이스에 액세스하려면 데이터베이스를 마우스 오른쪽 단추로 클릭 한 다음 상황에 맞는 메뉴에서 Reports -> Standard Reports -> Schema Changes History

TSQL을 통해 동일한 정보를 검색하려면 다음을 사용할 수 있습니다.

SELECT StartTime
       ,LoginName
       --,f.*
FROM   sys.traces t
       CROSS APPLY fn_trace_gettable(REVERSE(SUBSTRING(REVERSE(t.path),
                                                       CHARINDEX('\', REVERSE(t.path)), 
                                                       260)
                                             ) + N'log.trc', DEFAULT) f
WHERE  t.is_default = 1
       AND ObjectName = 'FOO'
       AND EventClass IN (46, /*Object:Created*/
                          47, /*Object:Dropped*/
                          164 /*Object:Altered*/ )

고마워 마틴, 나는 'FOO'를 내 견해로 바꾸어 쿼리를 실행했지만 아무것도 반환하지 않았습니다. 왜 그런 일이 생길지 아십니까? 나는 서버에서 실행하지 않았다
— xorpower

1
@ Xorpower- Object:Created뷰를 변경하지 않고 삭제하고 만든 경우 이벤트 를 처리하도록 이벤트 를 편집했습니다 . 서버에서 실행하지 않는다는 것이 무슨 뜻인지 잘 모르시겠습니까? 물론 올바른 인스턴스에 연결해야하지만 권한이있는 한 연결의 위치는 중요하지 않습니다.
— Martin Smith

고마워 마틴, 결과는 여전히 동일
— xorpower


3
@Xorpower-추적이 롤오버되어 약 11 시간이 지난 세부 정보를 잃어버린 것 같습니다. 기본 추적은 5 개의 파일 만 유지 한 다음 이전 파일을 삭제합니다. 서버의 파일 시스템에서 폴더를 확인하여 폴더를 확인하는 것이 좋습니다. 폴더 경로는 다음과 같습니다.SELECT path FROM sys.traces where is_default=1
— Martin Smith

19

Martin은 이미 관리 감사 추적에 대한 최선의 길을 지적했습니다 (명시 적으로 비활성화되지 않은 경우 제외). 관리자 추적에서 정보를 찾을 수없는 경우 (비활성화되었거나 재활용 된 경우) 로그 백업에서 정보를 검색 할 수 있습니다. 프로덕션 DB이므로 정기적 인 전체 백업 및 로그 백업과 함께 정기적 인 백업주기가 있다고 가정합니다. DDL이 현재 복원 된 로그에 있도록 사고 발생 시점까지 데이터베이스를 별도의 서버에서 데이터베이스를 복원해야합니다. 그런 다음 fn_dblog()로그 를 사용 하고 검사 하는 간단한 문제입니다 .

한 가지 방법은 트랜잭션 시작 조작으로 이동하는 것입니다.

select [Begin Time], [Transaction Name], [Transaction SID], * 
from fn_dblog(null, null)
where Operation = 'LOP_BEGIN_XACT';

ALTER VIEW가 독립형 트랜잭션으로 발행 된 경우 (즉, BEGIN TRANSACTION/로 묶지 않음 COMMIT) 이름이 지정된 트랜잭션이 시작됩니다 CreatProc transaction. 그것을 찾으십시오. 그리고 [Transaction SID]원하는 로그인 SID입니다.

또 다른 가능성은 원하는 뷰에서 SCH_M을 획득 한 트랜잭션을 찾는 것입니다.

select [Lock Information], * 
from fn_dblog(null, null)
where [Lock Information] like '%' + cast(object_id('...') as varchar(10))+'%'
and [Lock Information] like '%LOCK_SCH_M%'
go

뷰가 DROP에 의해 변경되고 CREATE가 뒤 따르면 오브젝트 ID가 변경되었을 가능성이 있지만 최소한 CREATE를 마지막으로 수행 한 트랜잭션 (복원 된 db에있는 뷰의 현재 오브젝트 ID)을 얻게됩니다. 거래 ID로 돌아가서 거래 시작 정보를 검색합니다.

select [Begin Time], [Transaction Name], [Transaction SID], *
from fn_dblog(null, null)
where [Transaction ID] = '...'
and Operation = 'LOP_BEGIN_XACT';

[Transaction SID]는 다시 여러분입니다. SUSER_SNAME로그인 SID에서 로그인 이름을 검색하는 데 사용 합니다. SID가 0x01 인 경우 로그인이 sa되었음을 의미합니다. 이는 sa비밀번호 를 알고있는 개인이 비밀번호를 수행 할 수 있음을 의미 합니다.


2
로그 파일 읽기에 대한 유용한 팁. 누군가가 기본 추적을 비활성화 한 경우에 유용합니다.
— StanleyJohns

트랜잭션 SID가 null이면 어떻게됩니까?
— 퇴거 음

@evictednoise 관련 로그 레코드를 별도의 질문으로 게시하십시오. 하나 이상의 이유와 로그 레코드가 실제 원인을 판별하는 데 도움이 될 수 있습니다.
— Remus Rusanu 2016 년

6

아니요, DDL 트리거 등을 통해 로그인하지 않는 한

해당 데이터베이스 또는 sysadmin / db_owner / ddl_admin 역할의 멤버 자격을 ALTER 권한으로보고자합니다. 이것은 마녀 사냥보다 일반적인 검토로 더 좋습니다. 비 승인 및 무단 변경을 할 권리가있는 다른 사람이있을 수 있습니다.


0

아직 SQL Server Management Studio에서 사용 가능한 스키마 변경 기록 보고서 를 확인하지 않았 으면 할 수 있습니다 . 기본적으로 SQL Server가 변경 사항을 기록하는 것처럼 보이는 ( 기본 추적 )이 보고서를 통해 해당 데이터를 볼 수 있어야합니다. 유감스럽게도 시간이 지남에 따라 이러한 추적 파일이 자동으로 삭제 / 롤오버되므로 데이터가 이미 사라질 수 있습니다. 행운을 빕니다!


맙소사. Martin Smith는 이미이 보고서를 그의 답변에서 참조했습니다. 링크가 도움이 되더라도 여기에 남겨 두겠습니다.
— Mark Madej
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.