데이터베이스는 버전 관리가 쉽지 않다는 문제가 있습니다.
(물론 몇 가지 방법을 쓰면 불가능한 건 아닌데 일반적인 프로젝트 관리에 비하면....-_-;)
그래서 테스트DB와 실제DB와 차이가 크게 날 경우 저장 프로시저 같은 것들은 싹 날리고 생성하는 게 편합니다.
그 외에도 여러 가지 용도로 테이블이나 함수, 뷰 같은 것을 한 번에 지우기도 합니다.
저번 글에서 저장 프로시저나 테이블 같은 구성요소를 검색하는 방법을 알아봤습니다.
(참고 : [MSSQL] MSSQL의 여러 구성요소 검색하기 - 'sys.objects')
검색 결과를 보면 이름이 출력되죠,
그러니 앞뒤로 쿼리를 붙여주면 우리가 원하는 동작을 하는 쿼리를 만들 수 있습니다.
예를 들면 테이블의 경우 'Drop Table'만 앞에 추가해주면 됩니다.
Select 'Drop Table ' + name As Command
From sys.objects
Where type='U'
이렇게 말이죠.
이제 이렇게 나온 결과를 복사해서 '새 쿼리' 창을 열어 붙여넣은 뒤 실행하면 테이블이 날아갑니다.
몇 가지 흔이 쓰는 구성요소용 쿼리입니다.
--테이블
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'
그냥 결과를 복사해서 쿼리창에 붙여넣은 후 실행을 하셔도 해당 쿼리가 동작합니다.
하지만 "그것조차 귀찮다."라고 하신다면 커서를 이용하여 일괄 처리 할 수 있습니다.
(참고 : [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에서 이걸 지원 안 하는지 모르겠습니다.
(다들 안 하니까 안 하는 건가.....)
어찌 됐건 저장 프로시저의 버전을 관리하기 위해 트리거를 거는 방법은 인터넷에 많습니다.
버전 관리는 그걸로 하시고 지울 때는 이렇게 일괄 처리하세요~