|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
因此我们的方案中要构造这种逆操作。Event_type增加一种FlashBACK_EVENT。这类操作形式与Query_Event相同,都是简单的SQL语句,只是包含了将数据恢复的操作。数据
形貌:会商怎样处置树形数据,排序,新增,修正,复制,删除,数据完全性反省,汇总统计
表布局形貌及数据情况:
表名tb,假如修正表名,则响应修正一切数据处置中触及到的表名tb
id为编号(标识字段+主键),pid为下级编号,name为称号,前面能够自行增添其他字段.
但凡未特别标注的中央,对自行增添的字段不影响处置了局/*--数据测试情况
表名tb,假如修正表名,则响应修正一切数据处置中触及到的表名tb
id为编号(标识字段+主键)
pid为下级编号
name为称号,前面能够自行增添其他字段.
但凡未特别标注的中央,对自行增添的字段不影响处置了局
--表情况
createtabletb(idintidentity(1,1)notnullconstraintPK_tbprimarykeyclustered
,pidint,namevarchar(20))
insertintotb
select0,中国
unionallselect0,美国
unionallselect0,加拿年夜
unionallselect1,北京
unionallselect1,上海
unionallselect1,江苏
unionallselect6,姑苏
unionallselect7,常熟
unionallselect6,南京
unionallselect6,无锡
unionallselect2,纽约
unionallselect2,旧金山
go
--处置中必要利用的函数及存储历程
--1.自界说函数--猎取编码累计
createfunctionf_getmergid(@idint)
returnsvarchar(8000)
as
begin
declare@revarchar(8000),@pidint
--为了数字排序一般,必要一致编码宽度
declare@idlenint,@idheadervarchar(20)
select@idlen=max(len(id))
,@idheader=space(@idlen)
fromtb
--失掉编码累计
set@re=right(@idheader+cast(@idasvarchar),@idlen)
select@pid=pidfromtbwhereid=@id
while@@rowcount>0
select@re=right(@idheader+cast(@pidasvarchar),@idlen)+,+@re
,@pid=pidfromtbwhereid=@pid
return(@re)
end
go
--2.自界说函数--检测某个编码动身,是不是被轮回援用
createfunctionf_chkid(@idint)
returnsbit--轮回,前往1,不然前往0
as
begin
declare@rebit,@pidint
set@re=0
--检测
select@pid=pidfromtbwhereid=@id
while@@rowcount>0
begin
if@pid=@id
begin
set@re=1
gotolbErr
end
select@pid=pidfromtbwhereid=@pid
end
lbErr:
return(@re)
end
go
/*--数据复制
假如表中包括自界说字段,必要修正存储历程
存在嵌套不凌驾32层的成绩.
--*/
--3.复制指定结点下的子结点到另外一个结点下
createprocp_copy
@s_idint,--复制该项下的一切子项
@d_idint,--复制到此项下
@new_idint--新增添项的入手下手编号
as
declare@nidint,@oidint,@namevarchar(20)
selectid,nameinto#tempfromtbwherepid=@s_idandid<@new_id
whileexists(select1from#temp)
begin
select@oid=id,@name=namefrom#temp
insertintotbvalues(@d_id,@name)
set@nid=@@identity
execp_copy@oid,@nid,@new_id
deletefrom#tempwhereid=@oid
end
go
--4.批量复制的存储历程--复制指定结点及其上面的一切子结点,并天生新结点
createprocp_copystr
@s_idvarchar(8000)--要复制项的列表,用逗号分开
as
declare@nidint,@oidint,@namevarchar(20)
set@s_id=,+@s_id+,
selectid,nameinto#tempfromtb
wherecharindex(,+cast(idasvarchar)+,,@s_id)>0
whileexists(select1from#temp)
begin
select@oid=id,@name=namefrom#temp
insertintotbvalues(@oid,@name)
set@nid=@@identity
execp_copy@oid,@nid,@nid
deletefrom#tempwhereid=@oid
end
go
--6.失掉指定id的子id列表
createfunctionf_getchildid(@idint)
returns@retable(idint)
as
begin
insertinto@reselectidfromtbwherepid=@id
while@@rowcount>0
insertinto@reselecta.id
fromtbainnerjoin@rebona.pid=b.id
wherea.idnotin(selectidfrom@re)
return
end
go
--7.失掉指定id的父id列表
createfunctionf_getparentid(@idint)
returns@retable(idint)
as
begin
declare@pidint
select@pid=pidfromtbwhereid=@id
while@pid0
begin
insertinto@revalues(@pid)
select@pid=pidfromtbwhereid=@pid
end
return
end
go
--8.删除指定结点
createprocp_delete
@idint,--要删除的id
@deletechildbit=0--是不是删除子1.删除子,0.假如@id有子,则删除失利.
as
if@deletechild=1
deletefromtbwheredbo.f_getmergid(id)likedbo.f_getmergid(@id)+%
else
ifexists(select1fromtbwherepid=@id)
gotolbErr
else
deletefromtbwhereid=@id
return
lbErr:
RAISERROR(该结点下有子结点,不克不及删除,16,1)
go
--9.失掉编码累计及编码级别表,这个是针对全表的,次要是应当于全表处置:
createfunctionf_getbmmerg()
returns@retable(idint,idmergvarchar(8000),levelint)
as
begin
declare@idlenint,@idheadervarchar(20),@levelint
select@idlen=max(len(id)),@idheader=space(@idlen)fromtb
set@level=1
insertinto@reselectid,right(@idheader+cast(idasvarchar),@idlen),@level
fromtbwherepid=0
while@@rowcount>0
begin
set@level=@level+1
insertinto@reselectb.id,a.idmerg+,+right(@idheader+cast(b.idasvarchar),@idlen),@level
from@reainnerjointbbona.id=b.pid
wherea.level=@level-1
end
return
end
go
--使用:
/*--数据显现排序--*/
--分级显现--横向,先一级,后二级...
select*fromtborderbypid
--分级显现--纵向
select*fromtborderbydbo.f_getmergid(id)
go
/*--数据统计--*/
--分级统计,每一个区域下的明细区域数
select*,
明细区域数=(selectcount(*)fromtbwheredbo.f_getmergid(id)likedbo.f_getmergid(a.id)+,%)
fromtbaorderbydbo.f_getmergid(id)
go
/*--数据新增,修正
数据新增,修正(包含修正所属的种别)没有甚么技能
,只必要反省所属的下级是不是存在就好了.这个能够复杂的用上面的语句来办理:
ifexists(select1fromtbwhereid=@id)print存在elseprint不存在
--*/
--删除美国的数据
--execp_delete2--不包括子,由于有美国下有子,以是删除会堕落
execp_delete2,1--包括子,将删除美国及一切数据
go
原文拜见我在CSDN上宣布的贴子
http://expert.csdn.net/Expert/topic/2285/2285830.xml?temp=.1212885
BlackHole黑洞引擎,写入的任何数据都会消失,一般用于记录binlog做复制的中继 |
|