数据库表记录的一种同步方案
作者:网络转载 发布时间:[ 2014/1/20 13:19:15 ] 推荐标签:测试技术 开发
在实际应用中,触发器脚本是用LUA脚本生成的。
local file_in = "d:\sync_tables.sql"
local file_out = "d:\sync_trigs.sql"
local tbl_prop = {}
local fp = io.open(file_in, "r")
if fp then
while true do
s1 = fp:read("*l")
if not s1 then break end
_,_,s2 = string.find(s1, ""([%w%_]+)"")
if s2 then
tbl_prop[s2] = 1
end
end
end
local sql_prep = [[
drop trigger if exists trig_$OP_$TAB;
delimiter |
create trigger trig_$OP_$TAB after $OP on $TAB
for each row
begin
update Tab_Version_Tab set TrigVersion=UNIX_TIMESTAMP() where Tab_Name = '$TAB';
end;
|
delimiter ;
]]
local tbl_rep = {"insert", "update", "delete"}
local fp_out = io.open(file_out, "w")
if fp_out then
fp_out:write("use xopensdb
")
for k,v in pairs(tbl_prop) do
fp_out:write("-- triggers of " .. k .. "
")
for k1,v1 in pairs(tbl_rep) do
local sql_out = sql_prep
sql_out = string.gsub( sql_out, "$TAB", k);
sql_out = string.gsub( sql_out, "$OP", v1);
fp_out:write(sql_out)
fp_out:write("
")
end
fp_out:write("
")
end
end
二、 维护表记录一致
从数据库定时访问Tab_Version_Tab,检查是否发生变化,如果发生变化,则将主数据库的数据表按条件导入到从数据库的临时表中,然后比较临时表和本地表的记录是否相同:
1. 比较两者记录个数是否相同
2. 用natural join取出的记录个数和本地表记录是否相同
SELECT COUNT(*) FROM table_local NATURAL JOIN table_tmp;
如果不同,则清空本地表,从临时表插入。
MySQL无DBLINK,否则访问远端数据库会简单些。

sales@spasvo.com