检查数据库名称与数据库逻辑名、物理文件名称是否一致,并生成修复脚本
2008-05-28 00:24
447 查看
检查数据库名称与数据库逻辑名、物理文件名称是否一致,并生成修复脚本:
(目前只考虑一个数据库有mdf,ldf两个文件,要是存在多个文件组,就不能使用下面的方法,因为对于多个文件组的数据库,用户可以有自己的文件命名规则。当然可以根据实际的命名规则,修改下面语句来实现判断各名称是否一致、合理)
测试下面的语句时,请在测试机器上执行,本代码不保证所有兼容,和安全性。
Set Nocount On
use master
If Object_id(N'tempdb..#') Is Not null
Drop Table #
Create Table #(
[database] nvarchar(128),
[name] varchar(128),
[filename] nvarchar(1024),
[Path] nvarchar(1024),
[filegroup] nvarchar(50),
Flag int
)
Declare @Sql nvarchar(4000)
Declare @i int,
@MaxID int
Select @i=1,@MaxID=Max(dbid) From master.sys.sysdatabases
While @i<=@MaxID
Begin
Set @Sql=''
Select @Sql=@Sql+char(13)+char(10)+'Insert Into # ([database],[name],[filename],[filegroup])
Select '''+[name]+''',A.[name],A.[filename],B.[groupname] From '+Quotename([name])+'.sys.sysfiles A
Left Outer Join sys.sysfilegroups B On A.groupid=B.groupid
Where Replace([name],'''+[name]+''','''') Not In('''',''_data'',''_log'') Or
Replace(Right([filename],Charindex(''\'',Reverse([filename]))-1),'''+[name]+''','''') Not In (''.mdf'',''_data.mdf'',''_log.ldf'')'
From master.sys.sysdatabases
Where dbid=@i And [name] Not In('master','model','msdb','tempdb')
Set @i=@i+1
exec (@Sql)
End
Update #
Set @i=Charindex('\',Reverse([filename]))
,[Path]=Stuff([filename],len([filename])-@i+2,@i,'')
,Flag=Case when Replace([name],[database],'') Not In('','_data','_log') Then 1 Else 0 End +
Case When Replace(Right([filename],@i-1),[database],'') Not In('.mdf','_data.mdf','_log.ldf') Then 2 Else 0 End
Set @Sql=''
If Exists(Select 1 From #)
Begin
Set @Sql='Use master '
Select @Sql=@Sql+char(13)+char(10)+'Alter database '+quotename([database])+ ' Modify File (Name='+[name]+
Case When flag<>2 And [filegroup]='PRIMARY' Then ',Newname='+[database]+'_data'
When flag<>2 And [filegroup]Is null Then ',Newname='+[database]+'_log'
Else '' End +
Case When flag>1 And [filegroup]='PRIMARY' Then ',Filename='''+[path]+[database]+'_data.mdf'''
When flag>1 And [filegroup] Is null Then ',Filename='''+[path]+[database]+'_log.ldf'''
Else '' End+')'+Char(13)+char(10)+
Case When flag>1 And [filegroup]='PRIMARY' Then 'Alter database '+quotename([database])+' Set Offline'+Char(13)+char(10)+'Exec xp_cmdshell ''rename '+quotename([filename],'"')+' '+[database]+'_data.mdf'+''''+char(13)+char(10)+'Alter database '+quotename([database])+' Set Online'
When flag>1 And [filegroup] Is null Then 'Alter database '+quotename([database])+' Set Offline'+Char(13)+char(10)+'Exec xp_cmdshell ''rename '+quotename([filename],'"')+' '+[database]+'_log.ldf'+''''+char(13)+char(10)+'Alter database '+quotename([database])+' Set Online'
Else '' End
From #
End
If @Sql>''
Print @Sql --Exec (@Sql)
如随便建立一个测试数据库test, 把Test数据库名称改成MyTempDB
调用上面的SQL语句就会生成一下的修复脚本:
/*
Use master
Alter database [MyTempDB] Modify File (Name=Test_data,Newname=MyTempDB_data,Filename='D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\MyTempDB_data.mdf')
Alter database [MyTempDB] Set Offline
Exec xp_cmdshell 'rename "D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\Test_data.mdf" MyTempDB_data.mdf'
Alter database [MyTempDB] Set Online
Alter database [MyTempDB] Modify File (Name=Test_log,Newname=MyTempDB_log,Filename='D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\MyTempDB_log.ldf')
Alter database [MyTempDB] Set Offline
Exec xp_cmdshell 'rename "D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\Test_log.ldf" MyTempDB_log.ldf'
Alter database [MyTempDB] Set Online
*/
(目前只考虑一个数据库有mdf,ldf两个文件,要是存在多个文件组,就不能使用下面的方法,因为对于多个文件组的数据库,用户可以有自己的文件命名规则。当然可以根据实际的命名规则,修改下面语句来实现判断各名称是否一致、合理)
测试下面的语句时,请在测试机器上执行,本代码不保证所有兼容,和安全性。
Set Nocount On
use master
If Object_id(N'tempdb..#') Is Not null
Drop Table #
Create Table #(
[database] nvarchar(128),
[name] varchar(128),
[filename] nvarchar(1024),
[Path] nvarchar(1024),
[filegroup] nvarchar(50),
Flag int
)
Declare @Sql nvarchar(4000)
Declare @i int,
@MaxID int
Select @i=1,@MaxID=Max(dbid) From master.sys.sysdatabases
While @i<=@MaxID
Begin
Set @Sql=''
Select @Sql=@Sql+char(13)+char(10)+'Insert Into # ([database],[name],[filename],[filegroup])
Select '''+[name]+''',A.[name],A.[filename],B.[groupname] From '+Quotename([name])+'.sys.sysfiles A
Left Outer Join sys.sysfilegroups B On A.groupid=B.groupid
Where Replace([name],'''+[name]+''','''') Not In('''',''_data'',''_log'') Or
Replace(Right([filename],Charindex(''\'',Reverse([filename]))-1),'''+[name]+''','''') Not In (''.mdf'',''_data.mdf'',''_log.ldf'')'
From master.sys.sysdatabases
Where dbid=@i And [name] Not In('master','model','msdb','tempdb')
Set @i=@i+1
exec (@Sql)
End
Update #
Set @i=Charindex('\',Reverse([filename]))
,[Path]=Stuff([filename],len([filename])-@i+2,@i,'')
,Flag=Case when Replace([name],[database],'') Not In('','_data','_log') Then 1 Else 0 End +
Case When Replace(Right([filename],@i-1),[database],'') Not In('.mdf','_data.mdf','_log.ldf') Then 2 Else 0 End
Set @Sql=''
If Exists(Select 1 From #)
Begin
Set @Sql='Use master '
Select @Sql=@Sql+char(13)+char(10)+'Alter database '+quotename([database])+ ' Modify File (Name='+[name]+
Case When flag<>2 And [filegroup]='PRIMARY' Then ',Newname='+[database]+'_data'
When flag<>2 And [filegroup]Is null Then ',Newname='+[database]+'_log'
Else '' End +
Case When flag>1 And [filegroup]='PRIMARY' Then ',Filename='''+[path]+[database]+'_data.mdf'''
When flag>1 And [filegroup] Is null Then ',Filename='''+[path]+[database]+'_log.ldf'''
Else '' End+')'+Char(13)+char(10)+
Case When flag>1 And [filegroup]='PRIMARY' Then 'Alter database '+quotename([database])+' Set Offline'+Char(13)+char(10)+'Exec xp_cmdshell ''rename '+quotename([filename],'"')+' '+[database]+'_data.mdf'+''''+char(13)+char(10)+'Alter database '+quotename([database])+' Set Online'
When flag>1 And [filegroup] Is null Then 'Alter database '+quotename([database])+' Set Offline'+Char(13)+char(10)+'Exec xp_cmdshell ''rename '+quotename([filename],'"')+' '+[database]+'_log.ldf'+''''+char(13)+char(10)+'Alter database '+quotename([database])+' Set Online'
Else '' End
From #
End
If @Sql>''
Print @Sql --Exec (@Sql)
如随便建立一个测试数据库test, 把Test数据库名称改成MyTempDB
调用上面的SQL语句就会生成一下的修复脚本:
/*
Use master
Alter database [MyTempDB] Modify File (Name=Test_data,Newname=MyTempDB_data,Filename='D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\MyTempDB_data.mdf')
Alter database [MyTempDB] Set Offline
Exec xp_cmdshell 'rename "D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\Test_data.mdf" MyTempDB_data.mdf'
Alter database [MyTempDB] Set Online
Alter database [MyTempDB] Modify File (Name=Test_log,Newname=MyTempDB_log,Filename='D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\MyTempDB_log.ldf')
Alter database [MyTempDB] Set Offline
Exec xp_cmdshell 'rename "D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\Test_log.ldf" MyTempDB_log.ldf'
Alter database [MyTempDB] Set Online
*/
相关文章推荐
- sql server 数据库修复,mdf 损坏 修复 直接从物理文件 抽取数据 生成新的数据库
- 在脚本中, 使用sqlite3检查android程序生成的数据库是否OK
- SQLServer 本地移动发布/订阅/分发数据库文件并更改逻辑名称和物理文件名
- SQLServer 本地移动发布/订阅/分发数据库文件并更改逻辑名称和物理文件名
- 在脚本中, 使用sqlite3检查android程序生成的数据库是否OK
- 修复打开Excel提示,“您尝试打开的文件的格式与文件扩展名指定的格式不一致,打开前请验证文件示被损坏且来源可信,是否立即打开该文件?”
- 数据库生成脚本后,文件太大,无法打开 解决方案(转)
- LinuxShell-检查指定目录是否存在shell脚本文件
- shell脚本--检查文件是否存在
- 项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次
- SQL SERVER 2005 修改数据库名称,包括物理文件名和逻辑名称
- 检查日志文件是否传输到备用数据库
- PowerDesigner逆向操作(从mysql5.0生成数据库的物理模型),把Comment写到name中,pdm文件导出为word
- python 获取脚本传递参数 及参数个数 检查文件 变量 是否存在 退出脚本
- 用于windbg检查文件是否匹配的python脚本
- PowerDesigner之导入sql文件 生成数据库物理模型
- SQLServer中检查数据库中是否存在某个表,不存在则生成该表
- 实战:mysql检查物理磁盘中的二进制日志文件是否有丢失
- SQL:实现附加数据库、更改数据库物理文件名、更改逻辑文件名、更改数据库名
- python 获取脚本传递参数 及参数个数 检查文件 变量 是否存在 退出脚本