Sql-Server

在緊急/單使用者模式下使用“生成腳本”

  • February 16, 2014

我正在嘗試創建一個 INSERT 腳本來從損壞的數據庫中的單個表中搶救數據。

我已成功將數據庫置於聯機狀態並將其置於緊急/單使用者模式(遵循此http://www.sqlskills.com/blogs/paul/disaster-recovery-101-hack-attach-a-damaged-database/ )

這允許對數據進行選擇。但是,當嘗試在 SSMS 中使用“生成腳本”工具時,我收到一個錯誤,因為已經存在與數據庫的連接。我假設腳本工具正在嘗試創建第二個(本地 sql 伺服器?)連接/打開數據庫以完成其工作,但我的 SSMS 會話被阻塞。

是否可以確保腳本工具使用與已建立的連接相同的連接?還是斷開連接,但將數據庫保持在 EMERGENCY 模式?

您可以斷開連接,數據庫將保持在 EMERGENCY/SINGLE 使用者模式。SSMS 中的對像管理器確實使用它自己的連接。我不確定腳本生成器工具是否使用另一個連接。但是,無法保證您的生成腳本工具連接將在您斷開連接後佔用一個連接。最好的辦法是在備用數據庫上生成腳本(無論您將數據移動到哪裡都應該可以工作)。然後將該腳本複製到連接到數據庫的查詢視窗並執行它。

編輯:

好的,我做了一些測試。如果您刪除查詢連接並在對象資源管理器中打開一個連接,您可以編寫一個 INSERT 語句(假設這是您想要的)。

在對象資源管理器中找到您的表,然後右鍵點擊它。轉到腳本表為 -> 插入到 -> 剪貼板

在此處輸入圖像描述

確保使用剪貼板。如果您執行新的查詢視窗,它將失敗。然後斷開對象資源管理器並打開數據庫的查詢視窗並粘貼。

否則,我將需要有關INSERT您嘗試創建哪種類型的語句的更多資訊。

EDIT2:基於評論

假設您在同一個實例上擁有目標數據庫(您試圖將數據移動到的位置)(如果至少暫時沒有創建一個),則使用以下程式碼。

INSERT INTO DestinationDB.dbo.DestinationTable
SELECT * FROM SourceTable

如果您有一個身份列,那麼您將必須執行以下操作

SET IDENTITY_INSERT DestinationDB.dbo.DestinationTable ON

INSERT INTO DestinationDB.dbo.DestinationTable
(Field List)
SELECT [Field List] FROM SourceTable

SET IDENTITY_INSERT DestinationDB.dbo.DestinationTable OFF

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