또...., SQL Script 를 블로그에 늘어 놓습니다. 블로그 반찬꺼리도 떨어지고 있고 고객 요구사항도 있고 해서 겸사 겸사 기록을 남겨 봅니다. 이럴 때 아님 또 언제 스크립트 남겨 보겠습니까?
[사용방법]
EXEC master..up_RENAME_CreateDBDate '데이터베이스 이름'
예를 들어 LAIGO 데이터베이스가 있을 경우,
EXEC master..up_RENAME_CreateDBDate 'LAIGO' 라고 수행하면 데이터베이스 이름이 'LAIGO_20090610' 으로 변경됩니다. 이 때, 20090610 은 실제 데이터베이스가 생성된 날짜입니다. RENAME 을 시도하려 하였으나 해당 DB가 존재하지 않는다면 그냥 종료됩니다.
추가적으로 이 스크립트를 수행하면(sp_renamedb) create_date 가 스크립트를 수행한 시점으로 변경됩니다.
[스크립트]
USE [MASTER]
GO
/*-------------------------------------------------------------------------------------------------------
스크립트 정보 : 데이터베이스 이름을 DB 생성일자를 기준으로 데이터베이스이름_YYYYMMDD로 변경하는 스크립트
작성자 : Lai Go
작성일자 : 2009.06.11
실행방법 : EXEC master..up_RENAME_CreateDBDate '데이터베이스 이름'
-------------------------------------------------------------------------------------------------------*/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROC [dbo].[up_RENAME_CreateDBDate]
@userDBName sysname
AS
SET NOCOUNT ON
DECLARE @newDBname Varchar(50)
, @CreateDBDate datetime
, @suffix Varchar(8)
, @ExistDB char(1)
-- DB가 존재한다면 RENAME 과정이 필요없으므로 종료하삼
SELECT @ExistDB = count(*) from sys.databases where name = @userDBName
IF @ExistDB = 0
BEGIN
RETURN 0
END
SELECT @CreateDBDate = create_date from sys.databases where name=@userDBName
SET @suffix = convert(char(8), @CreateDBDate, 112)
SET @newDBname = @userDBName + '_' + @suffix
-- SESSION ROLLBACK
EXEC('ALTER DATABASE '+@userDBName+' SET SINGLE_USER WITH ROLLBACK IMMEDIATE')
BEGIN TRY
-- RENAME
EXEC sp_renamedb @userDBName, @newDBname
END TRY
BEGIN CATCH
-- RENAME 실패시MultiUser 전환
EXEC('ALTER DATABASE ' + @userDBName + ' SET MULTI_USER')
END CATCH
-- MultiUser 전환
EXEC('ALTER DATABASE ' + @newDBname + ' SET MULTI_USER')
SET NOCOUNT OFF
작성자 : Lai Go / 작성일자 : 2009.06.11