쿼리 및 기타 T-SQL 로깅


14

SQL Server 2008 R2에 SELECT명령문에 대한 기본 로깅 체계 (또는 해당 문제에 대한 다른 T-SQL) 가 있는지 알고 싶습니다 .

그렇다면 어디에서 볼 수 있습니까? 그렇지 않은 경우 어떻게 설정할 수 있습니까?

답변:


18

기본적으로 SQL Server 활동은 예상 한대로 기록되지 않습니다. 일부 쓰기 활동은 트랜잭션 로그에 기록 되지만 데이터베이스 설정 방법에 따라 다릅니다.

서버에서 SELECT 활동을 추적하기위한 네 가지 기본 옵션이 있습니다.

  1. SQL Server 프로파일 러 를 사용하여 서버에 연결하고 발생하는 특정 활동을 감시 할 수 있습니다 .

  2. 서버 측 추적 을 작성하여 활동을 서버의 추적 파일에 기록하면 SQL Server 프로파일 러에서 읽거나 fn_trace_gettable 을 사용하여 추가 분석을 위해 테이블에로드 할 수 있습니다.

  3. 서버 쪽 추적보다 더 많은 기능을 제공하고 SQL Server 2012로 시작하는 서버 쪽 추적 대신 Microsoft에서 권장 하는 확장 이벤트 를 사용할 수 있습니다 .

  4. C2 감사 모드를 사용할 수 있습니다 .

당신은 서버 측 추적을 만들려면 추적을 설정 (선택 특정 이벤트, 필터 등 당신이 원하는 것을를) 다음 밖으로 스크립트를 파일 메뉴를 사용하고 서버에서 실행하는 SQL Server 프로파일을 사용할 수 있습니다 설명 여기 .


5

SELECT 문을 추적하는 몇 가지 SQL Server 솔루션 및 기술이 있습니다.

  1. 특별히 개발 된 저장 프로 시저 및 함수 – 참고 :이 방법에는 T-SQL 프로그래밍에 대한 고급 지식과 저장 프로 시저 및 함수의 추가 유지 관리 (예 : 데이터베이스 스키마 변경의 경우)가 필요합니다. 이 기사에서 더 많은 것을 볼 수 있습니다 : http://alstechtips.blogspot.com/2011/02/auditing-select-statements-in-sql.html

  2. SQL Server 추적 기술-이 기사에서 단계별 지침을 읽을 수 있습니다. http://solutioncenter.apexsql.com/auditing-select-statements-on-sql-server/

  3. SQL Server 감사 기능 사용-SQL Server 2008에 도입 된 감사 기능은 서버 및 데이터베이스 이벤트를 모두 추적 할 수 있으며 확장 이벤트 기술을 사용합니다. 그러나 데이터베이스 수준 감사는 SQL Server Developer 및 Enterprise 버전에서만 지원됩니다.

  4. ApexSQL Audit 또는 Idera SQL Compliance Manager와 같은 타사 도구 사용


3

기본적으로 SELECT 문은 기록하지 않습니다. SELECT 문을 감사하는 자세한 내용은 여기 에서 내 대답을 참조하십시오 .

또한 기본적으로 T-SQL 문도 기록하지 않고 대신 서버 메모리 변경, 감사 로그인 실패, 감사 Addlogin 이벤트 등과 같은 이벤트 를 기록하며 T-SQL 스크립트와 함께 여기 에서 정보를 추출하는 자세한 정보를 찾을 수 있습니다. 기본 추적.


3

누가 쿼리를 실행했는지 신경 쓰지 않는 한 시스템에서 실행중인 쿼리에 대한 메트릭을 보는 방법이 있습니다. 이는 마지막 재시작 이후의 데이터로 제한되며 쿼리 확장 정도에 따라 계획 캐시 (또는 기타 메모리) 압력에 의해 발생할 수 있습니다.

;WITH x AS
(
  SELECT 
    [text] = SUBSTRING(t.[text], 
      (s.statement_start_offset/2)+1, 
      COALESCE(NULLIF(s.statement_end_offset,-1),DATALENGTH(t.[text])*2)
       -(s.statement_start_offset/2)), 
    s.execution_count, s.last_execution_time,
    s.max_logical_reads, s.max_elapsed_time
  FROM sys.dm_exec_query_stats AS s
  CROSS APPLY sys.dm_exec_sql_text(s.sql_handle) AS t
)
SELECT * FROM x
WHERE LTRIM([text]) LIKE 'SELECT%';

패턴을 확장하고 싶을 수도 있습니다. 예를 들어, 이것은 ;WITH아이러니하게 시작하는 쿼리를 무시 SELECT INTO하고 실제 테이블을 참조하지 않는 변수 할당을 캡처 할 수 있습니다.

그러나 그보다 더 자세한 정보가 필요한 경우 Nathan의 대답은 좋은 시작입니다 (추적을 사용하려는 경우를 제외하고 프로파일 러를 사용하지 마십시오). 시스템에 대한 모든 단일 쿼리를 로깅하는 것은 자유롭지 않다는 것을 기억하십시오.


데이터베이스의 모든 select 문을 모니터링하는 데 매우 신중한 위의 내용에 동의합니다.
Zane

귀하의 솔루션을 시도했습니다-이것이 프로 시저, 함수 및 트리거 만 제공하고 adhoc 실행 SQL 문은 제공되지 않을 수 있습니까?
Magier

@Magier 아니요, sys.dm_exec_query_stats는 쿼리 문 (임시 또는 모듈)에 대해서만보고해야합니다.
Aaron Bertrand
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.