首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

ASP.NET 實作 SQL Server 資料庫還原:解決獨佔鎖定與排他性存取衝突

     編輯:關於SqlServer

問題背景

畢業專題需實作資料庫備份/還原網頁。還原時常遇到 「資料庫正在使用中,無法取得排他存取權」 錯誤(排他性鎖定衝突)。

解決方案:強制離線斷開連線

還原前先執行:

ALTER DATABASE [DbName] SET OFFLINE WITH ROLLBACK IMMEDIATE;
ALTER DATABASE [DbName] SET ONLINE;

ROLLBACK IMMEDIATE 立即回滾未完成交易並斷開所有連線,確保還原時資料庫處於無連線狀態。

完整 C# 程式碼(ASP.NET WebForms)

void RestoreButton_Click(object sender, EventArgs e)
{
    string path = PathTextBox.Text;
    string dbName = DbDropDownList.SelectedValue;

    string offlineSql = "USE master; ALTER DATABASE [" + dbName + "] SET OFFLINE WITH ROLLBACK IMMEDIATE; ALTER DATABASE [" + dbName + "] SET ONLINE;";
    string restoreSql = "USE master; RESTORE DATABASE [" + dbName + "] FROM DISK = @path WITH REPLACE;";

    using (SqlConnection conn = new SqlConnection(ConnStr))
    {
        // 1. 強制離線/上線斷開連線
        SqlCommand offlineCmd = new SqlCommand(offlineSql, conn);
        conn.Open();
        offlineCmd.ExecuteNonQuery();
        conn.Close();

        // 2. 執行還原(參數化防注入)
        SqlCommand restoreCmd = new SqlCommand(restoreSql, new SqlConnection(ConnStr));
        restoreCmd.Parameters.Add("@path", SqlDbType.NVarChar).Value = path;

        try
        {
            restoreCmd.Connection.Open();
            restoreCmd.ExecuteNonQuery();
            InfoLabel.Text = "還原成功!已將備份 " + path + " 還原至資料庫 " + dbName;
        }
        catch (Exception ex)
        {
            InfoLabel.Text = "還原失敗!錯誤:" + ex.ToString();
        }
        finally
        {
            restoreCmd.Connection.Close();
        }
    }
}

關鍵點總結

  • 還原前 必須 設為 OFFLINE WITH ROLLBACK IMMEDIATE,否則若有連線會失敗。
  • 使用 WITH REPLACE 選項允許覆蓋現有資料庫。
  • 參數化查詢防止路徑注入。
  • 連線字串建議指向 master 資料庫,避免目標資料庫自身連線干擾。
  • 生產環境謹慎使用,建議加入確認對話框、記錄操作日誌、限制管理員權限。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved