2013. 8. 27. 15:00

데이터베이스는 버전 관리가 쉽지 않다는 문제가 있습니다.

(물론 몇 가지 방법을 쓰면 불가능한 건 아닌데 일반적인 프로젝트 관리에 비하면....-_-;)

그래서 테스트DB와 실제DB와 차이가 크게 날 경우 저장 프로시저 같은 것들은 싹 날리고 생성하는 게 편합니다.

 

그 외에도 여러 가지 용도로 테이블이나 함수, 뷰 같은 것을 한 번에 지우기도 합니다.

 

 

1. 명령어 생성

저번 글에서 저장 프로시저나 테이블 같은 구성요소를 검색하는 방법을 알아봤습니다.

(참고 : [MSSQL] MSSQL의 여러 구성요소 검색하기 - 'sys.objects')

 

검색 결과를 보면 이름이 출력되죠,

그러니 앞뒤로 쿼리를 붙여주면 우리가 원하는 동작을 하는 쿼리를 만들 수 있습니다.

 

예를 들면 테이블의 경우 'Drop Table'만 앞에 추가해주면 됩니다.

Select 'Drop Table ' + name As Command
From sys.objects
Where type='U'

 

 

이렇게 말이죠.

 

이제 이렇게 나온 결과를 복사해서 '새 쿼리' 창을 열어 붙여넣은 뒤 실행하면 테이블이 날아갑니다.

 

 

2. 흔히 쓰는 구성요소

몇 가지 흔이 쓰는 구성요소용 쿼리입니다.

--테이블
Select 'Drop Table ' + name As Command
From sys.objects
Where type='U'

 

--저장 프로시저
Select 'Drop Procedure ' + name As Command
From sys.objects
Where type='P'

 

--뷰
Select 'Drop View ' + name As Command
From sys.objects
Where type='V'

 

--함수
Select 'Drop Function ' + name As Command
From sys.objects
Where type='PN'

 

 

3. 일괄 실행

그냥 결과를 복사해서 쿼리창에 붙여넣은 후 실행을 하셔도 해당 쿼리가 동작합니다.

하지만 "그것조차 귀찮다."라고 하신다면 커서를 이용하여 일괄 처리 할 수 있습니다.

(참고 : [MSSQL] 셀랙트된 결과를 이용하여 일괄 처리 하기 - cursor)

 

--명령을 임시로 받을 테이블
Declare @tableCommand Table
( Command nvarchar(128));

--명령생성
insert into @tableCommand Select 'Drop View ' + name As Command
							From sys.objects
							Where type='V'

--select *
--from @tableCommand


--커서 사용시 명령을 임시로 넣을 변수
Declare @sCommand nvarchar(128);

Declare cursorDrop cursor
    For Select Command
        From @tableCommand;

Open cursorDrop;

Fetch Next From cursorDrop Into @sCommand;

While(@@FETCH_STATUS <> -1)
Begin;
    --명령 실행
    Exec sp_executesql @sCommand;
 
    --다음 결과 데이터로 이동
    Fetch Next From cursorDrop Into @sCommand;
End;

Close cursorDrop;
Deallocate cursorDrop;

 

이렇게 커서를 이용하면 일괄 처리도 가능합니다.

 

 

마무리

 

저장 프로시저의 버전 관리도 중요한데 왜 아직도 MSSQL에서 이걸 지원 안 하는지 모르겠습니다.

(다들 안 하니까 안 하는 건가.....)

어찌 됐건 저장 프로시저의 버전을 관리하기 위해 트리거를 거는 방법은 인터넷에 많습니다.

버전 관리는 그걸로 하시고 지울 때는 이렇게 일괄 처리하세요~