2017-09-12 113 views
0

我正在使用Powershell來腳本來動態恢復數據庫(sql server 2012)。Powershell invoke_sqlcmd未關閉連接

set-location "SQLSERVER:\sql\$host_name\$inst\databases\.$db_target" 
$db = Invoke-Sqlcmd -Query "select type_desc,name,physical_name from sys.master_files where database_id=db_id(N'$db_target') order by type_desc desc " 

當我執行該腳本,我得到了以下錯誤消息:

DBMS味精 - ODBC返回代碼< -1>,SQL國家< 37000>,SQL消息 < 3101> < [ Microsoft] [SQL Server Native Client 10.0] [SQL Server]獨有的 訪問因爲數據庫正在使用而無法獲得。>。

然後我用SSMS對數據庫進行脫機使

alter database [db_target] set offline with rollback immediate 

我的腳本工作正常之後。

問:

  1. 爲什麼invoke_sqlcmd不關閉會話?
  2. 我可以從我的powershell腳本執行alter database ....命令嗎?

感謝

+0

在你的代碼中,你是否關閉了像'$ dbconnection.Close()'這樣的連接...發佈代碼,以便我們可以提供更好的幫助。 – ShanayL

+1

也許連接池。在Invoke-SqlCommand之後嘗試'[System.Data.SqlClient.SqlConnection] :: ClearAllPools()'。 –

+0

我嘗試了很多選擇,但連接仍然打開。這裏是我的代碼 - – Judi

回答

0

這裏是我的代碼。它不關閉連接。我認爲我無法正確使用SMO選項

$host_name=$env:computername 
$inst="JUDI2012" 
$db_target="test_judi_custom" 
set-location "SQLSERVER:\sql\$host_name\$inst\databases\$db_target" 
$db = Invoke-Sqlcmd -Query "select type_desc,name,physical_name from sys.master_files where database_id=db_id(N'$db_target') order by type_desc desc" -QueryTimeout 1 
$conn = New-Object System.Data.SqlClient.SqlConnection 
$conn.ConnectionString = "Server=$($host_name);Database=$($db_target);Integrated_security=True;" 
$sqlquery=$("alter database $db_target set offline with rollback immediate") 
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand 
$SqlCmd.CommandText = 'select count(*) from sys.tables' 
$SqlCmd.Connection = $conn 
$Reader = $Command.ExecuteReader() 
$Datatable = New-Object System.Data.DataTable 
$Datatable.Load($Reader) 
$Datatable 
$Conn.Close() 
+0

嘗試'$ conn.Close()'而不是'$ Conn.Close()'。該變量被設置爲全部小寫。 –

0

我認爲更改爲小寫幫助,因爲它暴露了另一個錯誤。 無法連接到服務器。 我擔心我沒有在任何地方指定實例名稱。我有服務器(或主機)和數據庫名稱,但無處指定實例名稱。 想法?