为用户组建一套SQL Server应用系统时用户经常提到这样的要求:
如果其中一台服务器坏了怎样才能防止数据丢失并在最短的时间内恢复系统?
要解决这个问题肯定需要两台服务器并在两台服务器上装有相同的数据库保持两台服务器中的数据同步当主服务器坏了时将另外一台服务器更改一下计算机名称从而使得工作站可以继续运行
那么如何保持两台数据库中的数据同步呢? SQL Server提供了出版定阅机制可以将数据实时的拷贝到定阅服务器中 但在实际应用中发现一旦建立起了出版定阅关系在定阅服务器数据库中的触发器主键等东西都不见了!!! 当主服务器不能正常工作时要想让另一台服务器转变为主服务器除更改计算机名外还需建立触发器索引等过程比较烦琐特别当用户对数据库维护不熟悉时这种操作更加麻烦
Sql Server做为一种数据库管理系统它与客户的接口都是通过SQL语句进行的 用户在插入一条记录时SQL Server会接收到Insert语句;更改一条记录时会接收到 Update命令
那么如果我们能在SQL Server中跟蹤到所有发给SQL Server的SQL语句那么我们就可以知道数据库发生了哪些改变并可以将这种改变发给另外一到服务器从而实现数据实时同步的功能
值得高兴的是SQL Server 提供了跟蹤功能 它们是以 xp_trace_XXXXXX的一系列存储过程
你可以设置过滤条件从而只跟蹤影响你的数据库 变化的SQL 语句将这些SQL 语句存放在本地表中再从本地表中读出发送给另外一台服务器 从而实现数据同步功能 这种方法可以跟蹤任何类型的变化包括Image类型数据的改变
以下面是用BCB语句实现建立跟蹤过程:
bool TForm :: BuildTrace(int DBID
AnsiString AppFilter
AnsiString SQLFilter
AnsiString DstTable
int &TraceHandle)
{
char tempBuf[];
Query > Close();
Query > SQL > Clear();
TStrings *pSQL = Query > SQL;
pSQL > Add(USE master);
pSQL > Add(DECLARE @queue_handle int);
pSQL > Add(DECLARE @column_value int);
pSQL > Add(SET @column_value = ||||);
pSQL > Add(EXECxp_trace_addnewqueue @column_value@queue_handle OUTPUT);
pSQL > Add(EXEC xp_trace_seteventclassrequired @queue_handle );
wsprintf(tempBufEXEC xp_trace_setappfilter @queue_handle%sNULL AppFilterc_str());
pSQL > Add(AnsiString(tempBuf));
wsprintf(tempBufEXEC xp_trace_setdbidfilter @queue_handle%dDBID);
pSQL > Add( AnsiString(tempBuf));
wsprintf( tempBufExec xp_trace_settextfilter @queue_handle%sNULL SQLFilterc_str());
pSQL > Add(AnsiString(tempBuf));
wsprintf( tempBuf
EXEC xp_trace_setqueuedestination @queue_handleNULL%s
DstTablec_str()
);
pSQL > Add( AnsiString(tempBuf));
pSQL > Add(EXEC xp_trace_startconsumer @queue_handle);
pSQL > Add(SELECT @queue_handle QueueHandle);
try
{
Query > Open();
}
catch()
{
return false;
}
TraceHandle = Query > FieldByName(QueueHandle) > AsInteger;
return true;
}