web-dev-qa-db-ja.com

完全な復元を行わなくても、データベースのデフォルトの照合順序とサーバーバージョンを確認することはできますか?

私は、サポート目的でクライアントから大規模なSQLデータベースのバックアップを定期的に受け取る会社で働いています。複数のSQLバージョンと照合順序をサポートしていますが、現在、正しいSQLインスタンスに復元する前に、クライアントのSQLバージョンを手動で確認する必要があります。このプロセスを自動化する方法があるかどうか疑問に思っています。

私は探しています:

  1. データベースのバックアップ元のSQL Serverバージョンを検索します(2008 R2と2014および2017を取得)
  2. データベースのデフォルトの照合を見つける

正しくない可能性があるSQLインスタンスへの完全な復元を必要とせず、そのサイズのためにかなりの時間がかかります。 (たぶん少しずつ復元しますか?)

8
Austin

RESTORE HEADERONLY コマンドを使用してバックアップファイルを検査することにより、いくつかの情報を取得できます。リンクされたドキュメントは、すべての結果セットフィールドとその意味を説明していますが、探しているものは次のとおりです。

  • _[SoftwareVersionMajor]_
    • 8 = SQL Server 2000
    • 9 = SQL Server 2005
    • 10 = SQL Server 2008または2008 R2(区別については_[SoftwareVersionMinor]_を参照)
    • 11 = SQL Server 2012
    • 12 = SQL Server 2014
    • 13 = SQL Server 2016
    • 14 = SQL Server 2017
    • 15 = SQL Server 2019
  • SQL Server 2008 R2バックアップを取得している可能性がある場合は、_[SoftwareVersionMinor]_も必要です。この値は、そのバージョンでは「50」、その他のバージョンでは「00」になるはずです(これまでのところ)
  • _[Collation]_

例えば:

_RESTORE HEADERONLY FROM DISK =
N'C:\Program Files\Microsoft SQL Server\MSSQL15.SQL2019\MSSQL\Backup\master.bak'
_

それは結果セットを返します。アプリのコードからこれを実行している場合、これらの特定のフィールドを取得するのはかなり簡単なはずです。これをT-SQLから実行していて、プログラムで操作する必要がある場合は、次のことを行う必要があります。

  1. そのコマンドからのすべての可能な結果セットフィールドを持つローカル一時テーブルを作成します
  2. INSERT INTO ... EXEC(...)構文内で_RESTORE HEADERONLY_コマンドを実行します:
    _INSERT INTO #TempBackupInfo
      EXEC(N'RESTORE HEADERONLY FROM DISK =
      N''C:\Program Files\Microsoft SQL Server\MSSQL15.SQL2019\MSSQL\Backup\master.bak'';');
    _
  3. そのローカル一時テーブルから問題のフィールドを選択します
18
Solomon Rutzky