sql server数据库备份
您们好!
由于前一段时间没想好怎么做,导致客户对在程序中对于数据的删除操作不放心。所以,我想给她做一个数据库备份,误删后可以把数据还原。
请问大家,我因该怎么做,才保证程序能够正确。
谢谢大家了,因为我不想我的老板和客户失望,毕竟这是我第一个项目!
[解决办法]
我回来了,9点多那会吃饭去了。我在上面的回答有些错误,重新写了完整的代码回复你:
#pragma link "adortl.lib"#pragma link "dbrtl.lib"#include <adodb.hpp>void __fastcall TForm1::Button1Click(TObject *Sender){ TADOConnection *con = new TADOConnection(this); String strSvr = "127.0.0.1"; // 服务器 String strDbName = "dbTest"; // 数据库名 String strUserName = "sa"; // 登录用户名 String strUserPwd = "pwd"; // 密码 String strBakFile = "E:\\Temp\\123.bak"; // 备份文件名 try { con->ConnectionString = String().sprintf( "Provider=SQLOLEDB.1;" "Persist Security Info=True;" "Data Source=%s;" "User ID=%s;" "Password=%s;" "Initial Catalog=%s;", strSvr.c_str(), strUserName.c_str(), strUserPwd.c_str(), strDbName.c_str()); // 备份用的SQL String strBackupSQL = String().sprintf( "BACKUP DATABASE [%s] TO DISK = N'%s' " "WITH NOINIT , NOUNLOAD , NAME = N'%s 备份', " "NOSKIP , STATS = 10, NOFORMAT", strDbName.c_str(), strBakFile.c_str(), strDbName.c_str() ); // 还原用的SQL String strRestoreSQL = String().sprintf( "use tempdb\n" "RESTORE DATABASE [%s] FROM DISK = N'%s' " "WITH FILE = 1, NOUNLOAD , STATS = 10, RECOVERY\n" "use %s", strDbName.c_str(), strBakFile.c_str(), strDbName.c_str() ); // 备份 // con->Execute(WideString(strBackupSQL)); // 还原 con->Execute(WideString(strRestoreSQL)); } __finally { con->Connected = false; delete con; ShowMessage("完毕"); }}
[解决办法]
一、对于复杂环境的数据库来说,当前的通用做法是不做真实删除理由有:
1、一般情况下,我们的数据库要求记录用户的每个操作,无论是追加数据还是删除数据都要做到有据可查,有底可查。
2、一但出现操作错误,如果真实删除了,那就无可挽回。
二、所以,关键数据如果用户删除,我们一般都不在数据库里真实删除,关键数据一般都建一个标志字段,标志为真的记录客户端就不取它。
三、如果你怕长期下来数据库过于庞大,可以在SQL的计划任务中删去N天前的记录,当然前提是这些记录中有时间标志(加个时间字段)。一般多数情况下我们就根本不删。
四、对于数据库的备份,可以非常简单地利用SQL自有的功能进行,而且一般也不做在客户端,直接使用SQL的计划任务来进行(SQL2000中有维护向导的)。
五、对于数据库的还原,要求在还原过程中没有用户联接。这没有办法,如果客户正在写数据,还原数据那就两边冲突了!
六、要正儿八经地做出一个数据库管理程序来,请记住上面的一些原则。
七、此外,如果与财务相关,请记住,一定使用红字冲销原则。