'콘솔'에 해당되는 글 1건

  1. 2012.05.28 [MSSQL] sqlcmd 응용

디비 서버를 관리하다 보면 여러 서버들에 일괄적으로 쿼리를 수행할 할 일이 생기곤 한다

SSMS의 등록된 서버로 그룹 서버 전체에 명령어를 날일 수도 있지만

각 서버들에 아주 약간씩 다른녀석들이 있다면 이야기가 달라진다. (예를들어 DB명이나 하드코딩 같은...)


동적 쿼리를 생성하여 실행하는 EXEC나 sq_executesql 프로시저를 이용 할 수 도 있겠지만

장문의 프로시저를 동시에 생성하는 일은 문자열 길이를 초과해 버리면 곤란한 일일 수 밖에 없다.


이럴때 개인적으로 쓰는 방법은 SQLCmd를 활용하는 방법이다.

보안 규정에 따라 삭제하는 경우도 있는데 애석하게도 그런 경우엔 다른 방법을 찾아보는것이 좋겠다.



SQLCmd의 옵션을 살펴보자


디비서버에 접속하는 방법은 각각의 환경마다 다르니 생략하고 디비가 설치된 서버에서 직접 실행하며

윈도우 인증을 사용한다면 -E옵션은 복잡한 Connection String을 작성할 일을 해결해 준다.


여기서 주목해야 할 옵션은 -q, -Q, -i, -o 옵션이다.


IT를 한다는 사람이라면 너무나 친숙한 "Hello SQL"를 찍어보자


입력한 쿼리의 결과가 콘솔창에 뿌려진다

(만약 컬럼이 많다면 putty같은 프로그램으로 tenet접속을 해서 실행시킨것이 아닌 이상 감당할 수 없는 데이터를 받게 될 것이다.)

그렇다면 PRINT문은 어떻게 나올까?


SSMS상에서는 다른 탭으로 결과와 메시지로 구분되던 데이터가 함께 나온다.

하지만 이래서는 다른 사람에게 결과를 전달 할 수 없다.

다음과 같이 파일로 만들어 보자.


명령어를 수행한 결과가 텍스트로 떨어졌다.

명령어가 매번 간단하다고 보장 할 수 없다.

파일로 입력해보자.


역시 잘 작동 된다.

이미 눈치 챈 사람이 많을 것이다 왜 자꾸 수행 결과를 보여주는지 파일로 떨구는지 파일로 입력 받았는지...

다음과 같이 결과를 다시 입력으로 할 수도 있다.



위와 같이 프로시저 조자도 생성이 가능하다.

문자열을 조작하여 만드는것은 쉬운 일이니 서버마다 서버에 있는 값으로 하드 코딩된 나쁜 프로시저를 생성해야만 하는 일이 생긴다면 사용해 볼 수 있는 무기가 우리에게 생겼다



MySQL이나 Oracle의 경우 에초에 콘솔 기반이라 저런 꼼수를 많이 썻었지만

MSSQL은 기본으로 너무 좋은 GUI 툴을 주기 때문에 저런 꼼수를 쓸 생각을 못했으나 필요에 의해 사용할 일이 있어

찾아서 정리해 본다.




ps. 혹시 각 서버에 접속해서 일일이 실행하진 않을거라 믿는다.

중앙에서 각 서버에 접속 할 수 있는 곳이 있다면 배치 파일로(혹은 파워쉘로) 쉽게 일괄 실행을 할 수 있을 것이다.


ps2. PRINT 문장을 언제 일일이 써주냐는 사람이 있다면 열 편집이 가능한 텍스트 에디터를 사용해 보길 바란다.

(찾아보면 유용한 무료 텍스트 에디터가 많다.)

몇만라인의 프로시저라 해도(그런게 있으려나;) 약간의 머리와 몇초 정도면 저런 구문으로 만들 수 있다.


Posted by Mr.Jo :