14

次のように tsql を使用してデータベースをデタッチしました。

EXEC sp_detach_db @dbname = 'my_db'

次に、PHP を使用して物理ファイルの名前を変更しました。mdf ファイルの名前は変更できましたが、ldf ファイルの名前は変更できませんでした。dos コマンドも試してみましたRENが、ldf ファイルでも機能しませんでした。

質問したいのですが、名前を変更できないようにする物理ログ ファイルについて、何か特別なことはありますか?

これを行うより良い方法はありますか?

皆さんありがとう

4

6 に答える 6

15

データベースをデタッチし、ファイルの名前を変更して、再度アタッチします。

于 2015-08-29T14:07:51.197 に答える
10

「ALTER DATABASE (your database) MODIFY FILE」コマンドは、論理名の名前のみを変更します。この投稿では、xp_cmdshell を使用して物理ファイルの名前も変更する方法を示しています: http://www.mssqltips.com/sqlservertip/1891/best-practice-for-renaming-a-sql-server-database/

次の点に注意してください
。 1. xp_cmdshell は SQL Server プロセスを実行するユーザーで実行され、データベース ファイルの名前を変更するために必要なファイル システム権限を持っていない可能性があります
2. セキュリティ上の理由から、xp_xmdshell を無効にすることを忘れないでください

以下は、前述のブログ投稿に基づいて名前を変更する方法の例です。データベース MyDB をデータベース NewMyDB に置き換えます。元の MyDB (MyDB_OLD に名前が変更された) は切り離されたままになります。

-- Enable xp_cmdshell:
sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
GO
sp_configure 'xp_cmdshell', 1
RECONFIGURE WITH OVERRIDE
GO

-- Get physical file names:
declare @MyDBOriginalFileName nvarchar(300) = (select physical_name FROM sys.master_files where name = 'MyDB')
declare @MyDBLogOriginalFileName nvarchar(300) = (select physical_name FROM sys.master_files where name = 'MyDB_log')
declare @NewMyDBOriginalFileName nvarchar(300) = (select physical_name FROM sys.master_files where name = 'NewMyDB')
declare @NewMyDBLogOriginalFileName nvarchar(300) = (select physical_name FROM sys.master_files where name = 'NewMyDB_log')
declare @Command nvarchar(500)
declare @Sql nvarchar(2000)

IF (EXISTS (select * from sys.databases where name = 'NewMyDB') 
AND EXISTS (select * from sys.databases where name = 'MyDB'))
BEGIN
    USE master

    ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE
    ALTER DATABASE NewMyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE

        -- Set new database name
        ALTER DATABASE MyDB MODIFY NAME = MyDB_OLD
        ALTER DATABASE NewMyDB MODIFY NAME = MyDB

        -- Update logical names
        ALTER DATABASE MyDB_OLD MODIFY FILE (NAME=N'MyDB', NEWNAME=N'MyDB_OLD')
        ALTER DATABASE [MyDB] MODIFY FILE (NAME=N'NewMyDB', NEWNAME=N'MyDB')

        EXEC master.dbo.sp_detach_db @dbname = N'MyDB_Old'
        EXEC master.dbo.sp_detach_db @dbname = N'MyDB'

        -- Rename physical files
        SET @Command = 'RENAME "' + @MyDBOriginalFileName + '" "MyDB_OLD.mdf"'; PRINT @Command
        EXEC xp_cmdshell @Command
        SET @Command = 'RENAME "' + @MyDBLogOriginalFileName + '" "MyDB_OLD_log.mdf"'; PRINT @Command
        EXEC xp_cmdshell @Command
        SET @Command = 'RENAME "' + @NewMyDBOriginalFileName + '" "MyDB.mdf"'; PRINT @Command
        EXEC xp_cmdshell @Command
        SET @Command = 'RENAME "' + @NewMyDBLogOriginalFileName + '" "MyDB_log.mdf"'; PRINT @Command
        EXEC xp_cmdshell @Command

        -- Attach with new file names
        declare @NewMyDBFileNameAfterRename nvarchar(300) = replace(@NewMyDBOriginalFileName, 'NewMyDB',  'MyDB')
        declare @NewMyDBLogFileNameAfterRename nvarchar(300) = replace(@NewMyDBOriginalFileName, 'NewMyDB_log',  'MyDB_log')
        SET @Sql = 'CREATE DATABASE MyDB ON ( FILENAME = ''' + @NewMyDBFileNameAfterRename + '''), ( FILENAME = ''' + @NewMyDBLogFileNameAfterRename + ''') FOR ATTACH'
        PRINT @Sql
        EXEC (@Sql)

    ALTER DATABASE MyDB SET MULTI_USER 

END

-- Disable xp_cmdshell for security reasons:
GO
sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
GO
sp_configure 'xp_cmdshell', 0
RECONFIGURE WITH OVERRIDE
GO
于 2013-06-27T07:51:42.237 に答える
9

ALTER DATABASE次のようなステートメントを使用してそれを行うことができます。

ALTER DATABASE database_name
   MODIFY FILE ( NAME = logical_file_name, 
                 FILENAME = ' new_path/os_file_name_with_extension ' )

各ファイルを個別に変更する必要があります。たとえば、複数のデータファイルがある場合は、それぞれを変更する必要があります。

詳細については、このトピックに関するTechnetのドキュメントを参照してください。

于 2011-01-21T12:25:14.580 に答える
7

名前を変更する最も簡単な方法SQL server physical database filesは次のとおりです。

  1. SQL server名前を変更するデータベースがある場所を開いて接続します。
  2. 物理名と論理名を変更するには、クエリ ウィンドウで次のスクリプトを実行します。OldDatabaseNameすべての " " を、名前を変更するデータベースの新しい名前 (" ")に置き換えることを忘れないでくださいNewDatabaseName。すべてをデータベースに設定する新しい名前に置き換えNewDatabaseNameます

use OldDatabaseName

ALTER DATABASE OldDabaseName MODIFY FILE (NAME='OldDatabaseName', FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\NewDatabaseName.mdf');

ALTER DATABASE OldDatabaseName MODIFY FILE (NAME='OldDatabaseName_log', FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\NewDatabaseName_log.ldf');

ALTER DATABASE OldDatabaseName MODIFY FILE (NAME = OldDatabaseName, NEWNAME = NewDatabaseName);
ALTER DATABASE OldDatabaseName MODIFY FILE (NAME = OldDatabaseName_log, NEWNAME = NewDatabaseName_log);
  1. 次に、 を右クリックしOldDatabaseName、選択Tasksしてから選択しますTake Offline

  2. C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\...物理ファイルがある場所 ( ) に移動しNewDatabaseName、番号 2 で指定した名前に名前を変更します。コンピューターで使用されるこれらのファイルの絶対パスを確認してください。
  3. に戻りMicrosoft SQL Server Management Studioます。を右クリックし、OldDatabaseNameを選択Tasksしてから を選択しますBring Online
  4. 最後に、名前を に変更OldDatabaseNameしますNewDatabaseName。これで完了です:-)
于 2016-11-25T01:57:44.307 に答える