1 분 소요

MSSQL 개발 중에는 DB를 초기화해야 하는 경우가 종종 생긴다. 잘못된 데이터가 들어가거나, 코드 변경에 따라 DB 구조가 달라지면서 오류가 발생하기 때문이다.

DB를 아예 삭제하고 다시 생성하면 깔끔하지만, 그러면 테이블과 프로시저를 모두 다시 생성해야 한다. 원하는 것은 테이블 구조는 그대로 두고 데이터만 비우는 것이었다.

DELETE 쿼리로 테이블을 하나씩 비울 수도 있지만, 테이블 수가 늘어날수록 손이 너무 많이 간다.

자동화할 방법을 고민하다가 다음과 같은 프로시저를 작성했다.

USE [GameDB]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[GSP_GD_TABLE_TRUNCATE]
	@confirm			NVARCHAR(1024)
,	@o_result			INT		OUTPUT

AS

	SET NOCOUNT ON
	SET LOCK_TIMEOUT 30000
	SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

	IF @confirm != N'truncate_confirm'
		RETURN

	SET @o_result = -1000;

	BEGIN TRAN
		DECLARE @TEMP_TABLE TABLE( seq int identity, table_name NVARCHAR(1024) )

		INSERT	@TEMP_TABLE
				SELECT	CONCAT('TRUNCATE TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ';')
				FROM	information_schema.tables
				WHERE	TABLE_CATALOG = 'GameDB'

		DECLARE @i int, @j int
		SELECT @i = 1, @j = @@ROWCOUNT

		WHILE @i <= @j
		BEGIN
			DECLARE @sql NVARCHAR(1024) = (SELECT table_name FROM @TEMP_TABLE WHERE seq = @i)
			EXEC( @sql )

			SET @i = @i + 1
		END

    -- 추가로 삭제하고 싶은 테이블들은 여기에 별도로 추가
		TRUNCATE TABLE [AccountDB].[dbo].[OtherTable]

	IF @@ERROR = 0
	BEGIN
		COMMIT TRAN
		SET @o_result = 0;
	END
	ELSE
	BEGIN
		ROLLBACK TRAN
		SET @o_result = @@ERROR
	END

GO

프로시저를 실행할 때 인자에 truncate_confirm을 입력해야 한다. 이는 실수로 실행하는 것을 방지하기 위한 안전 장치다.

GameDB 외의 다른 데이터베이스 테이블을 추가로 비우고 싶다면 OtherTable 부분에 계속 추가하면 된다.

프로시저를 실행하면 GameDB 내 모든 테이블 목록을 자동으로 조회하고 TRUNCATE를 수행한다. TRUNCATE는 DELETE와 달리 AUTO_INCREMENT 값도 초기화된다.

개발 DB 초기화 요청이 들어오면 프로시저 한 번 실행으로 끝낼 수 있다.

댓글 남기기