重新开始SQLServer研究后的第一个想法,本来想写关于APPLY运算符的。
后来忽然发现虚拟机上的数据库名字起的不对,就想要写语句改一下数据库名,改名后发现不对,原来逻辑文件和物理文件都要改名的;
于是就想起来研究一下如何比较完整的“数据库改名”。 其实,问题主要就是集中在“逻辑文件”和“物理文件”的改名上; 通常情况下,我们创建数据库的时候,逻辑文件和物理文件名都是和数据库名字有关系的(一般都包含数据库名),改数据库名的时候最好连这两个也一起改掉。 于是就开始写代码了咯,当中的过程就不细说了,反正灰头土脸了几次,唉,丢人鸟~~~!~!~! 主要的步骤如下: STEP_1 修改逻辑文件名STEP_2 设置数据库为SINGLE_USERSTEP_3 设置数据库为OFFLINESTEP_4 移动物理文件STEP_5 修改物理文件名STEP_6 设置数据库为ONLINESTEP_7 设置数据库为MULTI_USERSTEP_8 修改数据库名 具体的代码如下: USE master GO SET NOCOUNT ON; DECLARE @OldDBName sysname,@NewDBName sysname DECLARE @Database_ID int ,@SQL nvarchar(1000) --变量初始化 SELECT @OldDBName = 'HelloFOFO',@NewDBName = 'DBADB' --SELECT @OldDBName = 'DBADB',@NewDBName = 'HelloFOFO' SELECT @Database_ID = Database_ID FROM sys.databases WHERE name = @OldDBName SELECT * FROM sys.databases WHERE Database_ID = @Database_ID SELECT database_id,type,type_desc,name,physical_name FROM sys.master_files WHERE Database_ID = @Database_ID SELECT '请复制【消息】里的脚本,执行数据库改名操作' AS '!!!!友情提示!!!!' --*********************************** --STEP_1 修改逻辑文件名 --*********************************** SELECT @SQL = '' SELECT @SQL = @SQL+'ALTER DATABASE '+@OldDBName+' MODIFY FILE(NAME = '+name+', NEWNAME = '+REPLACE(name,@OldDBName,@NewDBName)+')'+CHAR(10)+'GO'+CHAR(10) FROM sys.master_files WHERE Database_ID = @Database_ID PRINT '--修改逻辑文件名' PRINT @SQL --*********************************** --STEP_2 设置数据库为SINGLE_USER --*********************************** SELECT @SQL = 'ALTER DATABASE '+@OldDBName +' SET SINGLE_USER WITH ROLLBACK IMMEDIATE'+CHAR(10)+'GO'+CHAR(10) PRINT '--设置数据库为SINGLE_USER' PRINT @SQL --*********************************** --STEP_3 设置数据库为OFFLINE --*********************************** SELECT @SQL = 'ALTER DATABASE '+@OldDBName +' SET OFFLINE'+CHAR(10)+'GO'+CHAR(10) PRINT '--设置数据库为OFFLINE' PRINT @SQL --*********************************** --STEP_4 移动物理文件 --*********************************** SELECT @SQL = '' SELECT @SQL = @SQL+'xp_cmdshell ''move "'+physical_name+'" "'+REPLACE(physical_name,@OldDBName,@NewDBName)+'"'''+CHAR(10)+'GO'+CHAR(10) FROM sys.master_files WHERE Database_ID = @Database_ID PRINT '--移动物理文件' PRINT @SQL --*********************************** --STEP_5 修改物理文件名 --*********************************** SELECT @SQL = '' SELECT @SQL = @SQL+'ALTER DATABASE '+@OldDBName+' MODIFY FILE(NAME = '+REPLACE(name,@OldDBName,@NewDBName)+', FILENAME = '''+REPLACE(physical_name,@OldDBName,@NewDBName)+''')'+CHAR(10)+'GO'+CHAR(10) FROM sys.master_files WHERE Database_ID = @Database_ID PRINT '--修改物理文件名' PRINT @SQL --*********************************** --STEP_6 设置数据库为ONLINE --*********************************** SELECT @SQL = 'ALTER DATABASE '+@OldDBName +' SET ONLINE'+CHAR(10)+'GO'+CHAR(10) PRINT '--设置数据库为ONLINE' PRINT @SQL --*********************************** --STEP_7 设置数据库为MULTI_USER --*********************************** SELECT @SQL = 'ALTER DATABASE '+@OldDBName +' SET MULTI_USER'+CHAR(10)+'GO'+CHAR(10) PRINT '--设置数据库为MULTI_USER' PRINT @SQL --*********************************** --STEP_8 修改数据库名 --*********************************** SELECT @SQL = 'ALTER DATABASE '+@OldDBName+' MODIFY NAME = '+@NewDBName+CHAR(10)+'GO' PRINT '--修改数据库名' PRINT @SQL 其中,STEP_1、STEP_4、STEP_5是最重要的部分! 脚本说明: 上面的脚本在一个数据文件、一个日志文件的数据库上经过多次测试,可信性比较高;还需要增加一些逻辑判断,如“是否要改名的数据库、数据文件已经存在”等等多数据文件、多文件组的情况未测试