一种便宜的SQL Server数据库备份机制

作者:计算机世界日报 来源: 日期:2002-8-8
---- 现在很多企业都使用MS Windows NT为平台,SQL Server为后台数据库构建企业内部的Intranet,该成熟技术的普及,能有效地帮助企业对内部数据进行管理。在此应用中,对数据库的备份是很重要的一项工作。在大型单位,往往是采用双机备份机制,即在同一个NT域使用两台服务器,一个是主域控制器,另一个是备份域控制器,两台服务器上都有SQL&n 
bsp;Server,在程序的运行过程中,不断的将主域控制器中的SQL数据库新数据更新到备份域控制器的SQL数据库中。这种方案的缺点是,设备代价昂贵,不适合小型企业。对小型企业来说,添置一台备份服务器或增设一名能对NT系统进行全方面管理的人并由他定期使用SQL Server中的备份功能进行数据备份往往开销过大。那么,有没有更便宜的备份方案呢?答案是:有。这里,介绍一种用Visual Basic 5.0 开发的备份程序,将SQL数据库加密备份到Access数据库中的方法。该程序还能用Access备份库的数据恢复SQL数据库,从而减少因误操作而损坏数据内容而造成的损失。使用该方法,用户不须添加额外设备,只须运行该备份程序,其界面简单方便,适合无专业知识的一般用户使用。  

---- 开发所需软件:VB 5.0,Access 97  

---- 备份程序的设计方法:  

---- 一.用控制面版的ODBC设置,给SQL Server中的数据库添加一个数据源名称。  

---- 二.在Access中新建一个数据库,命名为backup.mdb。  

---- 三.用VB定义两个主要过程:Attach_Table() 和Create_Table() 。  

---- Attach_Table的作用是将SQL Server数据库中的所有需要备份的表链接到Access数据库中,(注意不是拷贝,链接仅提供对该表的临时访问,其效率要远远高于拷贝)。在此过程中要排除系统表,因为那是SQL Server自创建的,里面无用户数据。Create_Table的作用是在backup.mdb中创建目的表,即创建在这个备份Access库中的表用来保存所有存与SQL中的用户数据。另外,在链接过程中,要去掉SQL Server自带的拥有者名称(是隐含的,用户看不见),还定义了一个过程StripOwner()。  

---- 四.程序的逻辑结构:  

通过第一步创建的ODBC数据源打开要备份的SQL数据库  

使用Attach_Table() 将该数据库中的所有用户表链接到backup.mdb中  

使用Create_Table() 对每个表创建与之对应的备份表,取名可遵循如下原则,若原表叫table_name,则备份表叫b_table_name。  

将table_name表中的所有记录添加到b_table_name中。  

删除对SQL数据表的链接。  
---- 五.程序原码如下:  
//链接表的过程:a是表名,b是SQL数据库连接字符串。 
例如:b= "odbc;uid=sa;pwd=;dsn=thcg;database=thcw_cg" 
      a="danwei"  
Private Function AttachTable 
(a As String, b As String) As Boolean 
   Dim td As TableDef 
   Dim i 
    
   On Error GoTo e: 
   '先判断里头是否已有表 
   For i = 0 To backup_db.TableDefs.count - 1 
     If backup_db.TableDefs(i).name = a Then 
        AttachTable = True 
        Exit Function 
     End If 
   Next i 
   Set td = backup_db.CreateTableDef(a) 
   td.Connect = b 
   td.SourceTableName = a 
   backup_db.TableDefs.Append td 
   AttachTable = True 
   Exit Function 
e: 
  MsgBox Err.Description, vbInformation, p_title 
  AttachTable = False 
  Exit Function 
End Function 
//创建新表的过程 
Private Sub Create_Table(a As String)  ' 
在Access库中创建欲备份的目的表:b_xxxx 
  Dim i 
  Dim tblTableDefObj As TableDef 
  Dim fldFieldObj As Field 
  Dim indIndexObj As Index 
  Dim tdf As TableDef 
  Dim fld As Field 
  Dim idx As Index 
  Dim str As String 
  Dim source As String 
    
   '创建表 
   Set tblTableDefObj = backup_db.CreateTableDef() 
   str = Trim(a) 
   source = Mid(str, 3) 
   tblTableDefObj.name = StripOwner(str) 
   '创建字段 
   For i = 0 To backup_db.TableDefs(source). 
Fields.count - 1 
    Set fld = backup_db.TableDefs(source).Fields(i) 
Set fldFieldObj = backup_db.TableDefs 
(source).CreateField(fld.name, fld.Type, fld.Size) 
    tblTableDefObj.Fields.Append fldFieldObj 
   Next 

  '追加新表 
  backup_db.TableDefs.Append tblTableDefObj 

End Sub 
//去除隐含名称的过程 
SQL给表加的隐含拥有者一般为"dbo." 
并加在头部,这里用"."来截取拥有者字符串。  
Function StripOwner(rsTblName As String) As String 

  If InStr(rsTblName, ".")  > 0 Then 
rsTblName = Mid(rsTblName, InStr(rsTblName, ".")  
+ 1, Len(rsTblName)) 
  End If 
  StripOwner = rsTblName 

End Function 

由于拷贝记录是VB对数据库的常规操作,这里不再赘述。  
---- 如果要从Access数据库中将数据恢复到SQL Server中,方法类似,仅仅是拷贝记录的方向反一下,从Access表往链接过来的SQL表中拷贝。 
相关文章