2009-04-08 24 views
7

Tôi đang cố gắng viết ứng dụng đơn giản trong C# để cho phép sao lưu, nén và gửi qua ftp cơ sở dữ liệu SQL Server của tôi. Một vấn đề mà tôi gặp phải là tôi không thể tạo tệp sao lưu (.bak) nếu tôi cố gắng làm ở vị trí khác với "C: \ Program Files \ Microsoft SQL Server \ MSSQL.3 \ MSSQL \ Backup Thư mục "hoặc" C: \ Program Files \ Microsoft SQL Server \ MSSQL.3 \ MSSQL \ Data ". Tôi hiểu rằng đây là một vấn đề trước khi nhập học. Ai đó có thể chỉ cho tôi các tài nguyên hoặc viết ở đây một đoạn trích ngắn làm thế nào để lập trình thêm quyền như vậy vào bất kỳ thư mục nào trên hệ thống của tôi.Tạo tập tin sao lưu SQL Server (.bak) với C# tới bất kỳ vị trí nào

Trân Kris

Trả lời

1

Hãy xem this article.

Hãy nhớ đặt quyền cho tài khoản mà phiên bản SQL Server đang chạy cùng.

0

Mặc dù điều này có thể không trả lời câu hỏi trực tiếp của bạn, tôi khuyên bạn nên xem xét các dịch vụ tích hợp SQL Server (SSIS). Điều này trông giống như điều SSIS chính xác được tạo ra, và trong phiên bản 2008 có khả năng sử dụng mã C# nếu cần thiết, các thành phần chuẩn sẽ không làm những gì bạn cần (các phiên bản cũ hơn được sử dụng VB.NET).

MSDN SSIS Info Link 1
SSIS 2005 Tutorial Link 2

Hãy nhìn vào nó.

8

tôi cho rằng bạn đang chạy chương trình của mình dưới dạng tác vụ được lên lịch ... bạn có cấp quyền bằng văn bản cho thư mục đích cho người dùng thực thi tác vụ không ??

chỉnh sửa:
với các điều khoản bạn có thể có 2 kịch bản:

  • cửa sổ authenification
  • hỗn hợp xác thực

nếu bạn đang sử dụng cửa sổ xác thực, đọc và quyền ghi của người dùng cửa sổ được thực hiện. nếu không thì các điều khoản cho tài khoản dịch vụ máy chủ sql.

và hành vi này có ý nghĩa với tôi và có thể chạm vào móng trong kịch bản của bạn!

chỉnh sửa 2:
tôi không muốn khuyến khích bạn làm như vậy ... một số quản trị viên có thể ghét bạn khi bạn mess up acl của họ nhưng this có thể làm các trick

btw: Magnus Johansson already gave bạn một "thử-này" liên kết

dù cho phương pháp nào bạn đi - (! như descriped trên) hãy chắc chắn để tay trong người sử dụng đúng

(fo r full history)
...

lưu ý phụ:
tôi biết đây không phải là câu trả lời chính xác cho câu hỏi của bạn, nhưng tôi khuyên bạn nên tạo bản sao lưu ...

như

using Microsoft.SqlServer.Management.Smo; 

var bdi = new BackupDeviceItem(/* your path inlcuding desired file */); 
var backup = new Backup 
{ 
    Database = /* name of the database */, 
    Initialize = true 
}; 

backup.Devices.Add(bdi); 

var server = new Server(this.SqlServer); 

try 
{ 
    backup.SqlBackup(server); 
} 
catch (Exception ex) 
{ 
    // * log or sth 
} 

bạn chỉ cần chăm sóc của .dll. lấy hội đồng cho phiên bản máy chủ mong muốn (một số thông số/thuộc tính khác nhau thông qua các phiên bản máy chủ khác nhau)
thông tin khác here

5

Ok Guys, Magnus and dittodhole! Cảm ơn sự giúp đỡ của bạn. Tôi đã kết hợp Magnus'es liên kết đến các bài viết về thiết lập permisions trên thư mục cùng với một số nghiên cứu thêm và cuối cùng tôi đã có nó :). Vì vậy, reassuming, tôi đang sử dụng Smo, và để tạo một thư mục với quyền thích hợp, tôi phải tìm nhóm thay vì win32_Users. Ở đây bạn có một đoạn trích ngắn nếu ai đó tìm thấy bài đăng này mà anh ấy có thể tìm thấy nó hữu ích:

string tempPath = Directory.CreateDirectory("C:\\path_to_your_folder").FullName; 

//set permissions 
SelectQuery sQuery = new SelectQuery("Win32_Group", 
            "Domain='" + 
            System.Environment.UserDomainName.ToString() + 
            "'"); 
try 
{ 
    DirectoryInfo myDirectoryInfo = new DirectoryInfo("C:\\path_to_your_folder"); 
    DirectorySecurity myDirectorySecurity = myDirectoryInfo.GetAccessControl(); 
    ManagementObjectSearcher mSearcher = new ManagementObjectSearcher(sQuery); 
    foreach (ManagementObject mObject in mSearcher.Get()) 
    { 
     string User = System.Environment.UserDomainName + "\\" + mObject["Name"]; 
     if(User.StartsWith("your-machine-name\\SQL")) 
     { 
      myDirectorySecurity. 
      AddAccessRule(new FileSystemAccessRule(User, 
                FileSystemRights.FullControl, 
                AccessControlType.Allow)); 
     } 
    } 
    myDirectoryInfo.SetAccessControl(myDirectorySecurity); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine(ex.StackTrace); 
} 

Một lần nữa cảm ơn mọi người đã giúp đỡ bạn! Stackoverflow đá!

0

Đây là một thủ tục là sử dụng để sao lưu trong C# .Hope nó giúp

public void BackupDatabase (string BackUpLocation, string BackUpFileName, string 
    DatabaseName, string ServerName) 
    { 

     DatabaseName = "[" + DatabaseName + "]"; 

     string fileUNQ = DateTime.Now.Day.ToString() + "_" + DateTime.Now.Month.ToString() + "_" + DateTime.Now.Year.ToString() +"_"+ DateTime.Now.Hour.ToString()+ DateTime.Now .Minute .ToString() + "_" + DateTime .Now .Second .ToString() ; 

     BackUpFileName = BackUpFileName + fileUNQ + ".bak"; 
     string SQLBackUp = @"BACKUP DATABASE " + DatabaseName + " TO DISK = N'" + BackUpLocation + @"\" + BackUpFileName + @"'"; 

     string svr = "Server=" + ServerName + ";Database=master;Integrated Security=True"; 

     SqlConnection cnBk = new SqlConnection(svr); 
     SqlCommand cmdBkUp = new SqlCommand(SQLBackUp, cnBk); 

     try 
     { 
      cnBk.Open(); 
      cmdBkUp.ExecuteNonQuery(); 
      Label1.Text = "Done"; 
      Label2.Text = SQLBackUp + " ######## Server name " + ServerName + " Database " + DatabaseName + " successfully backed up to " + BackUpLocation + @"\" + BackUpFileName + "\n Back Up Date : " + DateTime.Now.ToString(); 
     } 

     catch (Exception ex) 
     { 
      Label1.Text = ex.ToString(); 
      Label2.Text = SQLBackUp + " ######## Server name " + ServerName + " Database " + DatabaseName + " successfully backed up to " + BackUpLocation + @"\" + BackUpFileName + "\n Back Up Date : " + DateTime.Now.ToString(); 
     } 

     finally 
     { 
      if (cnBk.State == ConnectionState.Open) 
      { 

       cnBk .Close(); 
      } 
     } 
    } 
Các vấn đề liên quan