1

テスト中に、テストを実行する前に、同じデータベース内のいくつかのテーブルのコピーを作成したいと考えています。テストが完了したら、コピーを使用して元のテーブルを復元したいと考えています。

これを行う最善の方法は何ですか?
また、すべてのインデックスと制約が復元されていることを確認したいと考えています。

DECLARE @Tablename NVARCHAR(500)
DECLARE @BuildStr NVARCHAR(500)
DECLARE @SQL NVARCHAR(500)
SELECT @Tablename = 'my_Users'
SELECT @BuildStr = CONVERT(NVARCHAR(16),GETDATE(),120)
SELECT @BuildStr = REPLACE(REPLACE(REPLACE(REPLACE(@BuildStr,' 
',''),':',''),'-',''),' ','')
SET @SQL = 'select * into '+@Tablename+'_'+@BuildStr+' from '+@Tablename
SELECT @SQL

EXEC (@SQL) -- Execute SQl statement

上記を使用してコピーを作成した場合、どうすれば復元できますか。

SQL2005

4

4 に答える 4

2

何かのようなもの:

truncate table OriginalTable
insert into OriginalTable select * from CopiedTable

使用しているデータベースによっては、より高速な代替手段があります。

于 2012-06-11T16:00:35.613 に答える
1

私が最近使ったスクリプトは誰かの役に立つと思います。

テーブルをバックアップするには、次のクエリを使用できます。

DECLARE @tableName nvarchar(max), @tableName_bck nvarchar(max)
SET @tableName = 'SomeTable';
SET @tableName_bck = 'SomeTable_bck';


-- Backup
DECLARE @insertCommand nvarchar(max)
--SELECT INTO SomeTable_bck FROM SomeTable
SET @insertCommand = 'SELECT * INTO ' + @tableName_bck + ' FROM ' + @tableName
PRINT @insertCommand
EXEC sp_executesql @insertCommand

復元の場合、テーブルには IDENTITY フィールドがあることが多いため、SET IDENTITY_INSERT ON が必要であり、レコードを挿入するときに列リストを提供する必要もあります。そのため、スクリプトはもう少し複雑です。

DECLARE @tableName nvarchar(max), @tableName_bck nvarchar(max)
SET @tableName = 'SomeTable';
SET @tableName_bck = 'SomeTable_bck';

-- Restore
DECLARE @columnList nvarchar(max)
DECLARE @insertCommand nvarchar(max)

SELECT
    @columnList = SUBSTRING(
        (
            SELECT ', ' + column_name AS [text()]
            From INFORMATION_SCHEMA.COLUMNS
            WHERE table_name = @tableName
            ORDER BY table_name
            For XML PATH ('')
        ), 2, 1000);

--INSERT INTO SomeTable(Column1, Column2) SELECT Column1, Column2 FROM SomeTable_bck        
SELECT @insertCommand = 'INSERT INTO ' + @tableName + '(' + @columnList + ') SELECT ' + @columnList + ' FROM ' + @tableName_bck

IF EXISTS (
    SELECT column_name, table_name
    FROM INFORMATION_SCHEMA.COLUMNS
       WHERE table_schema = 'dbo' AND table_name = @tableName
       AND COLUMNPROPERTY(object_id(table_name), column_name, 'IsIdentity') = 1
    )
BEGIN
    SET @insertCommand = 
          'SET IDENTITY_INSERT ' + @tableName + ' ON;' 
        + 'TRUNCATE TABLE ' + @tableName + ';'
        + @insertCommand + ';'
        + 'SET IDENTITY_INSERT ' + @tableName + ' OFF;' 
    /*  
    SET IDENTITY_INSERT SomeTable ON
    TRUNCATE TABLE SomeTable
    INSERT INTO SomeTable(Column1, Column2) SELECT Column1, Column2 FROM SomeTable_bck    
    SET IDENTITY_INSERT SomeTable OFF
    */
END
ELSE
BEGIN
    SET @insertCommand = 
        'TRUNCATE TABLE ' + @tableName + ';'
        + @insertCommand
    /*
    TRUNCATE TABLE SomeTable
    INSERT INTO SomeTable(Column1, Column2) SELECT Column1, Column2 FROM SomeTable_bck     
    */
END 

PRINT @insertCommand
EXEC sp_executesql @insertCommand

@tableName と @tableName_bck を好きなように指定できることは簡単にわかります。たとえば、これはストアド プロシージャに含めることができるため、スクリプトは再利用可能です。

于 2016-05-16T15:02:17.437 に答える
1

これを行うには多くの方法がありますが、最も簡単な方法は、データベースのバックアップを取り、それを操作し、完了したらバックアップから復元することです。(手順はこちら)

テーブルのバックアップは確かに実行可能ですが、これは最も簡単な方法ではありません。また、複数のテーブルで作業を開始すると、さらに難しくなります。したがって、単一のテーブルを復元する具体的な例に対処するのではなく、テスト データの管理を改善するための一般的なアドバイスを提供します。

これを行う最も安全な方法は、オリジナルを復元しないことであり、むしろオリジナルに触れないことです。これをバックアップしてから、新しいテスト サーバーに復元します。(手順はこちら) ベスト プラクティスでは、ライブ データベースでテストや開発作業を行うべきではないことが規定されています。これも非常に簡単で安全です。

于 2012-06-11T16:06:37.350 に答える