ClearTrace 소개입니다.

예전에 김종균님께서 소개하신 글(http://www.sqler.com/105021)을 좀 보강했습니다.

ClearTrace 는 특별한 기능이 많이 있는 것은 아니지만, 간단하고 빠르게 확인하기엔 좋은 툴입니다.

ClearTraceSQL 2005, SQL 2008, SQL 2008 R2 버전에 대해 지원이 가능하며 Express버전은 지원이 안됩니다.

기준은 SQL Server 2008로 설명하려고 합니다.

1. 다운로드 및 설치

가. http://www.scalesql.com/cleartrace/download.aspx

위 사이트에서 다운로드하면 됩니다.

나. 다운로드받은 파일의 압축을 해제하면, ClearTrace.exeClearTraceCmd.exe 두 개의 파일이 생성되는데, GUI 환경인 ClearTrace.exe에서 확인해 보도록 하겠습니다.

다. 도메인 환경일 경우엔 원격장소에 설치해도 무관할 듯 하지만, 그렇지 않을 경우 SQL Server가 설치된 서버에 설치하셔야 합니다.

2. 최초 실행 및 환경설정

처음 실행하면DataBase를 만들어달라는 내용이 나옵니다.

1.jpg

3. Tools > Options를 클릭합니다.

2.jpg

4. Server명과 DataBase명을 기재합니다.

3.jpg

이 때, Database Name은 기존에 없는 것을 새로 만드는 것을 권장합니다. (분리를 위해)

5. 만약 서버명을 잘 못 기재하면 다음과 같은 메시지를 보게 됩니다.

4.jpg

6. 4.번 과정에서 새로 만들기 위해 새로운 이름을 주게 되면 다음과 같이 새로 만들겠냐는 문구가 뜹니다.

5.jpg

** 보시면 알겠지만, 로그인한 계정이 시스템 권한이 있어야 하고 DataBase Create 권한도 있어야 하네요.

7. ClearTrace 초기화면입니다. 중요한 항목만 간단하게 설명해 보겠습니다.

6.jpg

가. Trace Group : Group을 지정함으로써 용도에 따라 분류가 가능합니다. 이름만 적으시면 됩니다.

나. Trace Files

1) First File : 최초 작성할 파일명을 기재합니다.

2) Work Directory : 작업 디렉터리입니다.

3) Archive Directory : 작업 완료 후 trc 파일을 보관(이동)할 디렉터리입니다.

다. 기본지정이 완료되면 “Import Files” 버튼을 누릅니다.

8. Trace File Import가 진행되면 진행사항이“Import Status” 탭에 표시됩니다.

7.jpg

9. Import가 완료되면 자동으로 “Query the Imported Files” 탭으로 이동합니다. 중요한 항목만 간단하게 설명해 보겠습니다.

8.jpg

가. Trace Group To Query : 앞에서 지정한 그룹에 따라 추적그룹을 나눠서 처리할 수 있습니다.

나. Date To Query : 추적파일에 지정된 날짜에 따라 필터링이 가능합니다.

다. Rows : 표시할 줄 수입니다.

라. Group By : 집계할 항목(Item)의 컬럼을 지정합니다.

- SQL Text, Application Name, Login Name, Host Name, Date 등의 지정이 가능합니다.

마. Order By : 정렬순서입니다.

- CPU, Reads, Writes, Duration 등등 의 지정이 가능합니다.

바. Keyword Filter : 항목 Filtering입니다.

- Profiler에서 Ctrl+F 눌러서 나오는 값들로 Filtering했다고 보시면 됩니다.

사. Application Filter : 응용 프로그램에 따른 Filtering입니다.

- 예를 들어 .Net Application이 있다면.Net SqlClient Data Provider 항목이 존재합니다.

아. Login Filter : SQL Login Name에 따른 Filtering입니다.

자. Host Filter : Login Host Name에 따른 Filtering입니다.

차. Events : Profiler에서 설정한 Events에 따른 Filtering입니다.

- Batches, Statements 등등의 항목이 존재합니다.

카. Display Averages : Group By 값에 대한 평균값들을 보여줍니다.

- 이것을 클릭하면 AvgCPU, AvgReads, AvgWrites 등의 항목들이 늘어납니다.

타. Reset : 너무나도 당연한 이야기이지만, 조건을 초기화합니다.

파. Display : 위에서 설정한 조건대로 Filtering Soring한 결과를 표시합니다.


코엑스 오시면 어디가 어디냐고 물어보시는 분들 많아서. 괜히 준비.

1. 전체 배치도 및 지상건물

무역센터.jpg

무역센터 전체는 이렇게 이루어져 있습니다.

참고로 전체를 무역센터라고 하고,

지하 중 일부를 코엑스몰이라고 하지만, 그냥 지하는 보통 코엑스몰이라고 칭합니다.

지상은 건물이 다르지만, 지하는 모두 전부 연결되어 있습니다.

그래서 다들 헷갈리시죠~~~

A. 백화점은 현대백화점 하나입니다. 주말 정체의 원인이죠. ㅋ.

- 주차장은 테헤란로 옆으로 진입하는 곳이 별도로 있습니다.

B. 호텔은 총 세개입니다.

- 그랜드 인터컨티넨탈 호텔과 코엑스 인터컨티넨탈 호텔은 전혀 다른 건물입니다. 게다가 위치도 사실 아주 멀답니다.

- 참고로 오크우드 프리미어라는 호텔도 있습니다. 거기엔 7Luck 카지노도 있습니다.

- 그랜드 인터컨티넨탈 주차장 진입은 건물 앞에 별도로 있습니다. 참고로 다른 지하주차장과는 연결되어 있지 않습니다.

- 나머지 두 건물의 주차장도 별도의 진입로를 가지고 있습니다.

C. 도심공항타워와 한국도심공항은 건물이 다릅니다. 한국도심공항 건물은 층이 낮고, 도심공항타워는 그 옆에 높은 건물입니다.

- 한국도심공항과 도심공항타워는 주차장 진입로가 다릅니다. 참고로 한국도심공항이 공항으로 가는 리무진버스를 타는 곳입니다.

D. 무역과 회의 관련된 건물은 트레이드타워와 아셈타워 두 개입니다. 두 건물 중 트레이드타워가 가장 높고, 다음으로 아셈타워가 높습니다.

- 트레이드타워 주차장은 코엑스와 진입로를 같이 쓰기도 하지만, 지하로 내려가면 구역이 별도로 있으니 잘 보고 찾아가세요...

참고로 저희 회사가 위치해 있는 트레이드타워는 G3~G6 구역에 대시면 편하게 올라오실 수 있습니다. ㅋ.

E. 가장 면적이 넓은 지상건물이 코엑스 전시컨벤션센터입니다.

- 주차장은 트레이드타워와 진입로가 같지만 지하는 연결되어 있습니다.

다만 무슨 전시를 볼 것이냐에 따라 주차장 위치를 잘 못 대시면, 엄청 걸으셔야 합니다.

2. 코엑스몰(1층 단면 포함, 지하 1층 기준)

코엑스몰상단.jpg

코엑스몰.jpg

A. 코엑스몰 지하철역으로 올 때에는 2호선 삼성역 5번출구와 6번 출구 사이입니다.

코엑스몰로 오실 때 몇 번 출구냐고 물어보시는 분들이 많은데, 5번 출구도 6번 출구도 아닙니다.

코엑스몰은 삼성역 5번와 6번 사이입니다. 정말로요... 출구번호가 없죠. 처음엔 엄청 헷갈립니다.

B. 지하로 들어가면 KFC, 꽂집, 베스킨라빈스31 등이 위치한 넓은 광장이 있는데요.

예전엔 이 곳 지하광장에 흡연이 허용되었지만, 지금은 금연입니다. 흡연가 분들은 참고하시길.

C. 먹을 곳 관련 정보...

- 이 도면에는 코엑스몰 중심으로만 나와 있기 때문에, 그런 줄만 아시는데요.

각 건물 지하마다 전부 푸드코트가 있습니다.

주말에는 코엑스몰 입구에서 가장 가까운 푸드코트에만 바글바글한데요.

주말에 도심공항 건물이나 아셈타워 쪽으로 가시면 가시면 주말에 한가하게 식사하실 수 있어요. ㅋㅋㅋㅋ.

D. 만약 버스를 이용해서 아쿠아리움이나 메가박스 쪽으로 가시려면 봉은사 근처에서 내리시면 금방 가실 수 있습니다.

참고사이트.

http://www.coexmall.com/coexguide/flashmap/map.asp?floor=-1

또 쓰다 보니 괜히 길어졌네요. ㅋㅋㅋ.

개인적으로 한 집에서만 밥 먹는 것을 싫어해서 대부분의 건물지하 푸드코트에 다 가 봤습니다.

다음에는 무역센터 지하 푸드코트 탐방기라도 써 볼까요. ㅋㅋㅋ.




안녕하세요? [쓸만한게없네] 윤선식입니다.

간만에 글을 올리네요.

RAISERROR 관련된 글은 여기저기 있지만 심플하게 되어 있는 샘플이 없는 것 같아서 하나 올립니다.

예제는 A값과 B값을 입력받아서 A / B를 한 결과를 돌려주는 것입니다.

Procedure는 다음과 같이 구성합니다.

CREATE PROC [dbo].UP_RaiseTest

@VAL1 INT,

@VAL2 INT,

@VAL3 INT OUTPUT

AS

BEGIN

DECLARE @ErrorNumber INT;

DECLARE @ErrorSeverity INT;

DECLARE @ErrorState INT;

DECLARE @ErrorProcedure NVARCHAR(126);

DECLARE @ErrorLine INT;

DECLARE @ErrorMessage NVARCHAR(2048);

SET @ErrorNumber = 0;

BEGIN TRY

SET @VAL3 = @VAL1 / @VAL2;

END TRY

BEGIN CATCH

SELECT

@ErrorNumber = ERROR_NUMBER()

-- CATCH 블록을 실행시킨 오류의 오류번호를 반환합니다.

,@ErrorSeverity = ERROR_SEVERITY()

-- CATCH 블록이 실행되도록 오류의 심각도를 반환합니다.

,@ErrorState = ERROR_STATE()

-- CATCH 블록을 실행시킨 오류의 상태번호를 반환합니다.

,@ErrorProcedure = ERROR_PROCEDURE()

-- CATCH 블록이 실행되는 오류가 발생한 저장프로시저나 트리거의 이름을 반환합니다.

,@ErrorLine = ERROR_LINE()

-- CATCH 블록실행을 유발한 오류가 발생한 줄번호를 반환합니다.

,@ErrorMessage = ERROR_MESSAGE()

-- CATCH 블록을 실행시키는 오류의 메시지텍스트를 반환합니다.

END CATCH;

IF @ErrorNumber <> 0

BEGIN

SELECT

@ErrorNumber AS ErrorNumber

,@ErrorSeverity AS ErrorSeverity

,@ErrorState AS ErrorState

,@ErrorProcedure AS ErrorProcedure

,@ErrorLine AS ErrorLine

,@ErrorMessage AS ErrorMessage

;

RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState);

END

END

프로시져의 직접 실행 사용법은 다음과 같습니다.

DECLARE @RETVALINT

DECLARE @VAL1 INT, @VAL2 INT, @VAL3 INT

SET @VAL1 = 10;

SET @VAL2 = 0;

EXEC @RETVAL = dbo.UP_RaiseTest @VAL1, @VAL2, @VAL3 = @VAL3 OUTPUT;

SELECT @RETVAL, @VAL3;

위 프로시저를 실행한 결과는 다음과 같습니다.

SSMS_RAISERROR.jpg

같은Procedure.Net Program에서 다음과 같이 사용할 수 있습니다.

private void RaiseErrorTest()

{

string connectionString = "~~~~";

SqlConnection conn = null;

SqlCommand cmd = null;

int cnt = 0;

int intReturnValue = 0;

try

{

conn = new SqlConnection(connectionString);

cmd = new SqlCommand("TestDB.DBO.UP_RaiseTest", conn);

cmd.CommandType = CommandType.StoredProcedure;

SqlParameter pVal1 = cmd.Parameters.Add("@VAL1", SqlDbType.Int);

SqlParameter pVal2 = cmd.Parameters.Add("@VAL2", SqlDbType.Int);

SqlParameter pVal3 = cmd.Parameters.Add("@VAL3", SqlDbType.Int);

SqlParameter RetVal = cmd.Parameters.Add("@RetVal", SqlDbType.Int);

pVal3.Direction = ParameterDirection.Output;

RetVal.Direction = ParameterDirection.ReturnValue;

pVal1.Value = int.Parse(txtA.Text); // A 값을 받습니다.

pVal2.Value = int.Parse(txtB.Text); // B 값을 받습니다.

conn.Open();

cnt = cmd.ExecuteNonQuery();

intReturnValue = (int)RetVal.Value;

txtC.Text = pVal3.Value.ToString();

conn.Close();

}

catch (SqlExceptionSqlex)

// 부분이 반드시 필요함. 일반 Exception 받기 전에 SQL Exception 먼저 처리하도록 합니다.

{

foreach (SqlErrorerr in Sqlex.Errors)

// SQL Exception 가져옵니다.

{

txtC.Text = Sqlex.Message;

// C 값을 표시할 자리에 ERROR_MESSAGE() 가져오도록 합니다

}

}

catch (Exceptionex)

{

txtC.Text = ex.ToString();

}

finally

{

if (cmd != null)

cmd.Dispose();

}

}

form_1.jpg

정상적일 경우엔 10 / 5 = 2 의 값을 나타냅니다.

form_2.jpg

에러일 경우 C 값을 나타내는 자리에 ERROR_MESSAGE() 를 표시합니다.

이상입니다.


Windows 2008 Server PocketBook

+ Recent posts