Sql-Server

附加數據庫 - 驗證 - 從腳本或批處理文件中分離

  • January 22, 2012

有一百個很好的理由……我保證至少有幾個是好的……我發現自己擁有由不同版本的 sql server 生成的近 200 個 SQL server 數據庫(mdf、ldf 文件),大多數是 2005 年。

我需要驗證每個人的完整性並跟進失敗的人。

畢竟….我的問題是:

是否可以使用批處理文件或簡單腳本附加-驗證-分離每個數據庫?

我已經將 sqlcmd 用於類似的工作,但是對於這本書,我想我會看看是否有更簡單的方法。

這個相當棘手。我不知道如何訪問 DBCC 消息,但正在研究它。無論如何,這個 Powershell 腳本附加數據庫,執行 DBCC CHECKDB 並分離 dbs。

# Get database files from where ever they are
$databases = gci "C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data2\*.mdf"
$sqlCmds = @()
# Parse db names from file names somehow and generate attach/check/detach statements
foreach($db in $databases) {
 $dbName = [regex]::Replace($db.Name, "(?i)\.mdf", "")
 $lgName = [regex]::Replace($db.FullName, "(?i)\.mdf", ".ldf")
 $sqlCmds += $("CREATE DATABASE {0} ON (FILENAME = '{1}') LOG ON (FILENAME = '{2}') FOR ATTACH;"  -f $dbName, $db.FullName, $lgName)
 $sqlCmds += $("DBCC CHECKDB ({0});" -f $dbName)
 $sqlCmds += $("EXEC sp_detach_db @dbname='{0}';" -f $dbName)
}

[void][Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo")
$conn = new-object Microsoft.SqlServer.Management.Common.ServerConnection
$conn.ConnectionString = "Server=SERVER\INSTANCE;Database=master;Integrated Security=True"
$s = $sqlCmds[0]

# Try and execute the statements   
try {
   foreach($s in $sqlCmds) {
     $ret = $conn.ExecuteNonQuery($s)
     $ret
   }
} catch [system.exception] {
 $_.Exception.ToString()
}

引用自:https://dba.stackexchange.com/questions/11126