国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

解決兩相同數(shù)據(jù)庫數(shù)據(jù)同步的問題 (續(xù))

2024-07-21 02:09:09
字體:
供稿:網(wǎng)友

在上一篇<<解決兩相同數(shù)據(jù)庫數(shù)據(jù)同步的問題>> ,由于時間關(guān)系,沒有對buildtrace函數(shù)給出說明,在此做以補充 .

筆者是在山東濰坊出差時,遇到了用戶要求的提供雙機熱備份功能,
最終的解決方案是:
 在主服器上運行同步程序(用bcb5.0編寫的程序),同步程序在啟動時,在sql server 中建立跟蹤過程,跟蹤過程將跟蹤到的sql 語句存放在主服務(wù)器的跟蹤表中;
  同步程序每隔半分鐘訪問跟蹤表,將其中的sql 語句發(fā)送到備份服務(wù)器,并將其刪除!


/* 功能: 在sql server中建立跟蹤
  輸入?yún)?shù): dbid  - 想要跟蹤的數(shù)據(jù)庫的id號,可以用數(shù)據(jù)庫名在      master.dbosysdatabases中查出。
           appfilter - 限制跟蹤哪個客戶端應(yīng)用程序提交給sql server的sql語句
           sqlfilter - 限制跟蹤哪類的sql 語句,可以控制只跟蹤update,insert,delete 語句
           dsttable - 將跟蹤到的信息存儲到數(shù)據(jù)庫的哪一個表中
           tracehandle -引用類型變量,返回給調(diào)用者建立起的跟蹤句柄
  返回值: true 成功,false 失敗
*/

bool tform1 :: buildtrace(int dbid,
                        ansistring appfilter,
                        ansistring sqlfilter,
                        ansistring dsttable,
                        int &tracehandle)
{
    char tempbuf[512];                

query1 -> close();            //query1 為 tadoquery的組件
                              //實驗中發(fā)現(xiàn)若用bde中的tquery組件,對跟蹤到的 
                              //image類型數(shù)據(jù)會操作時會發(fā)生錯誤.
    query1 -> sql -> clear();
    tstrings *psql = query1 -> sql;

  
    psql -> add("use master");   //將當(dāng)前數(shù)據(jù)庫設(shè)為master       
    psql -> add("declare @queue_handle int");  
    psql -> add("declare @column_value int");
       // 可以跟蹤很多種信息,但通常只需要其中一部分, @column_value用來確定需要哪些信息.
    //下行每個數(shù)字代表一列,具體可參見transact -sql help
    psql -> add("set @column_value = 67108864|1|512|1024|10384");
     
       // 加入一個跟蹤過程,若成功, @queue_handle將是一個有效的值
    psql -> add("exec  xp_trace_addnewqueue 1000,5,95,90,@column_value,@queue_handle output");
   
   // 以下句設(shè)置跟蹤條件
   //設(shè)置跟蹤何種事件, 41為tsql complete事件, 還有其它事件,如連接事件等等,
   // 但對同步功能來說,只需要tsql complete事件.
    psql -> add("exec xp_trace_seteventclassrequired @queue_handle, 41,1 ");
  
   //設(shè)置跟蹤哪種客戶端的發(fā)過來的sql 語句,客戶端在向sql server發(fā)出命令時,都有一個
 // application name
    wsprintf(tempbuf,"exec xp_trace_setappfilter @queue_handle,'%s',null", appfilter.c_str());
    psql -> add(ansistring(tempbuf));
  
    // 設(shè)置跟蹤針對哪個數(shù)據(jù)庫的sql 語句
    wsprintf(tempbuf,"exec xp_trace_setdbidfilter @queue_handle,%d",dbid);
    psql -> add( ansistring(tempbuf));

  //設(shè)置sql 語句的過濾條件,可設(shè)置成" update%;delete%;insert%",則只跟蹤update
  // insert 和 delete語句
    wsprintf( tempbuf,"exec xp_trace_settextfilter @queue_handle,'%s',null", sqlfilter.c_str());
    psql -> add(ansistring(tempbuf));

 

  //設(shè)置將跟蹤到的信息存放在哪個表里 ,
   //如果表不存在,則自動創(chuàng)建,表的列數(shù)由前面的@colomun_value控制.
   // 為以后方便讀出控制,可以在自動創(chuàng)建了這個表后,手工的為其加上id字段(自動增長字段),
  // 并做為主索引.

    wsprintf( tempbuf,
              "exec xp_trace_setqueuedestination @queue_handle,4,1,null,'%s'",
              dsttable.c_str()
            );
    psql -> add( ansistring(tempbuf));

     // 開始跟蹤
    psql -> add("exec xp_trace_startconsumer @queue_handle");
    psql -> add("select @queue_handle queuehandle");

   
     // 將批命令提交到sql server, 執(zhí)行完畢后,跟蹤過程就建立起來了
      
    try
    {
        query1 -> open();
    }
    catch(...)
    {
        return false;
    }
    tracehandle = query1 -> fieldbyname("queuehandle") -> asinteger;
    return true;
}

//調(diào)用過程
...
int tracehandle
int dbid;

dbid = getdbid("mydb1");    //根據(jù)數(shù)據(jù)庫名從sql server的sysdatabases中查詢dbid

if( buildtrace( dbid,
                    "myapp",
                     "insert%;update%;delete%",
                     "mydb1.dbo.mytrace")
   == true)
{
    application -> messagebox("跟蹤過程已被建立","提示",mb_ok);
}
else
{
 application -> messagebox("跟蹤過程建立失敗","提示",mb_ok);
}
....

 


收集最實用的網(wǎng)頁特效代碼!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 当阳市| 黔南| 丁青县| 哈巴河县| 砀山县| 和硕县| 郎溪县| 正镶白旗| 仁寿县| 东光县| 石城县| 台北市| 伊宁县| 连州市| 辰溪县| 巢湖市| 伊宁县| 嘉义县| 溆浦县| 民丰县| 竹山县| 拜泉县| 达州市| 曲松县| 吴忠市| 寻乌县| 腾冲县| 海安县| 长寿区| 大城县| 旌德县| 长治县| 象州县| 黎川县| 开化县| 文安县| 麻城市| 基隆市| 抚宁县| 方山县| 郧西县|