2013-10-23 75 views
0

我想使用簡單的CLR函數來備份sql數據庫。從CLR功能備份數據庫

[SqlFunction(DataAccess = DataAccessKind.Read)] 
public static int BackupDb() 
{ 
    using (var conn = new SqlConnection("context connection=true")) 
    { 
     conn.Open(); 
     var cmd = new SqlCommand(
      @"backup database MyDatabase to disk='d:\temp\MyDatabase.bak' WITH INIT, STATS=10", conn); 
     cmd.ExecuteNonQuery(); 
    } 
    return 0; 
} 

但這個代碼提供異常 消息6522,級別16,狀態1,行的用戶定義的例程或聚合 「的backupdb」 執行過程中出現1個 一個.NET Framework錯誤: System.Data.SqlClient的.SqlException:函數內副作用運算符'BACKUP DATABASE'的無效使用。 System.Data.SqlClient.SqlException: at System.Data.SqlClient.SqlConnection.OnError(SqlException exception,Boolean breakConnection,Action 1 wrapCloseInAction) at System.Data.SqlClient.SqlCommand.RunExecuteNonQuerySmi(Boolean sendToPipe) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource 1 completion,String methodName,Boolean sendToPipe,Int32 timeout,Boolean asyncWrite) at System.Data。 SqlClient.SqlCommand.ExecuteNonQuery() at UserDefinedFunctions.BackupDb()

+1

您不能在函數內對數據庫進行更改。就這麼簡單。備份數據庫確實會更改該數據庫(特別是它如何處理事務日誌的各個部分) –

+0

謝謝,我創建了[SqlProcedure]而不是函數,現在它工作正常。如果你寫這個評論作爲答案,我會接受它。 – Milos

回答

1

您無法在函數內對數據庫進行更改。就這麼簡單。並且備份數據庫確實會更改該數據庫(特別是它如何處理事務日誌的各個部分)

如果您想要a)可以進入SQL Server的內容,b)可以讓您編寫c#代碼,和c)讓我們對數據庫進行更改,適合該定義的唯一對象是CLR Stored Procedure