如何以编程方式重命名数据库文件?
How to rename database file programmatically?
我有两个数据库:
database_A
。文件名是 database_A.mdf
.
database_B
。文件名是 database_B.mdf
.
然后我会做的:
Drop database_A
。
- 将
database_B
重命名为 database_A
:sp_renamedb 'database_B','database_A
。
但是,文件名仍然是database_B.mdf
。
是否可以仅通过代码将 database_B.mdf
重命名为 database_A.mdf
而无需设置数据库位置的路径?我无法使用 Management Studio 取消附加数据库。
类似这样,但是没有设置路径名:
ALTER DATABASE database_name
MODIFY FILE ( NAME = logical_file_name,
FILENAME = ' new_path/os_file_name_with_extension ' )
我不知道这是否有助于阐明我为什么需要它,但是,我会尝试为什么我需要它。这对我来说是必要的,因为当我创建 database_A
时,我会得到这个错误:
Cannot create file '...\database_A.mdf' because it already exists.
是否可以仅通过代码将 database_B.mdf
重命名为 database_A.mdf
而无需设置数据库位置的路径?我无法使用 Management Studio 取消附加数据库。
这里是一些示例 SQL,它将以编程方式获取 mdf 和 ldf 路径,以便您可以使用它们进行重命名,而无需对路径或文件名进行硬编码。它还获取逻辑文件名。这不是完整答案,这是答案的第一部分:
DECLARE @sql nvarchar(max);
DECLARE @params nvarchar(max);
DECLARE @dataFileName sysname;
DECLARE @logFileName sysname;
DECLARE @mdfFile nvarchar(400);
DECLARE @ldfFile nvarchar(400);
-- Get mdf and ldf file names
SET @params = '@mdfOUT nvarchar(400) OUTPUT, @ldfOut nvarchar(400) OUTPUT, @dataFileNameOUT sysname OUTPUT, @logFileNameOUT sysname OUTPUT'
SET @sql = N' SELECT @mdfOUT = physical_name FROM sys.database_files WHERE type = 0; ' +
N' SELECT @ldfOUT = physical_name FROM sys.database_files WHERE type = 1; ' +
N' SELECT @dataFileNameOUT = [name] FROM sys.database_files WHERE type = 0; ' +
N' SELECT @logFileNameOUT = [name] FROM sys.database_files WHERE type = 1; '
EXEC sp_ExecuteSql @sql, @params, @mdfOUT=@mdfFile OUTPUT, @ldfOUT=@ldfFile OUTPUT,
@dataFileNameOUT=@dataFileName OUTPUT, @logFileNameOUT=@logFileName OUTPUT;
SELECT @dataFileName AS [DataFileName], @mdfFile AS [mdf_File], @logFileName AS [LogFileName], @ldfFile AS [ldf_File]
如果您想更改数据库的文件名,您将阅读此内容
Renaming Physical Database File Names
当您的数据库附加到数据库服务中时,您无法更改数据库文件的名称。
因为数据库服务使用了数据和日志文件。
您将设置数据库单一用户并为您的数据库设置离线状态,然后使用
更改文件名
ALTER DATABASE XXX MODIFY FILE (Name='XXX', FILENAME='F:\MSSQL12.MSSQLSERVER\MSSQL\DATA\XXX_Renamed.mdf')
您将把您的数据库状态设置为离线,然后更改您的文件名并使用新文件名和对象浏览器文件名将状态设置为在线。
我有两个数据库:
database_A
。文件名是database_A.mdf
.database_B
。文件名是database_B.mdf
.
然后我会做的:
Drop database_A
。- 将
database_B
重命名为database_A
:sp_renamedb 'database_B','database_A
。
但是,文件名仍然是database_B.mdf
。
是否可以仅通过代码将 database_B.mdf
重命名为 database_A.mdf
而无需设置数据库位置的路径?我无法使用 Management Studio 取消附加数据库。
类似这样,但是没有设置路径名:
ALTER DATABASE database_name
MODIFY FILE ( NAME = logical_file_name,
FILENAME = ' new_path/os_file_name_with_extension ' )
我不知道这是否有助于阐明我为什么需要它,但是,我会尝试为什么我需要它。这对我来说是必要的,因为当我创建 database_A
时,我会得到这个错误:
Cannot create file '...\database_A.mdf' because it already exists.
是否可以仅通过代码将 database_B.mdf
重命名为 database_A.mdf
而无需设置数据库位置的路径?我无法使用 Management Studio 取消附加数据库。
这里是一些示例 SQL,它将以编程方式获取 mdf 和 ldf 路径,以便您可以使用它们进行重命名,而无需对路径或文件名进行硬编码。它还获取逻辑文件名。这不是完整答案,这是答案的第一部分:
DECLARE @sql nvarchar(max);
DECLARE @params nvarchar(max);
DECLARE @dataFileName sysname;
DECLARE @logFileName sysname;
DECLARE @mdfFile nvarchar(400);
DECLARE @ldfFile nvarchar(400);
-- Get mdf and ldf file names
SET @params = '@mdfOUT nvarchar(400) OUTPUT, @ldfOut nvarchar(400) OUTPUT, @dataFileNameOUT sysname OUTPUT, @logFileNameOUT sysname OUTPUT'
SET @sql = N' SELECT @mdfOUT = physical_name FROM sys.database_files WHERE type = 0; ' +
N' SELECT @ldfOUT = physical_name FROM sys.database_files WHERE type = 1; ' +
N' SELECT @dataFileNameOUT = [name] FROM sys.database_files WHERE type = 0; ' +
N' SELECT @logFileNameOUT = [name] FROM sys.database_files WHERE type = 1; '
EXEC sp_ExecuteSql @sql, @params, @mdfOUT=@mdfFile OUTPUT, @ldfOUT=@ldfFile OUTPUT,
@dataFileNameOUT=@dataFileName OUTPUT, @logFileNameOUT=@logFileName OUTPUT;
SELECT @dataFileName AS [DataFileName], @mdfFile AS [mdf_File], @logFileName AS [LogFileName], @ldfFile AS [ldf_File]
如果您想更改数据库的文件名,您将阅读此内容
Renaming Physical Database File Names
当您的数据库附加到数据库服务中时,您无法更改数据库文件的名称。
因为数据库服务使用了数据和日志文件。
您将设置数据库单一用户并为您的数据库设置离线状态,然后使用
更改文件名ALTER DATABASE XXX MODIFY FILE (Name='XXX', FILENAME='F:\MSSQL12.MSSQLSERVER\MSSQL\DATA\XXX_Renamed.mdf')
您将把您的数据库状态设置为离线,然后更改您的文件名并使用新文件名和对象浏览器文件名将状态设置为在线。