|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
有了数据以后,我们就要想一个比较统一的方法来闪回。上面我们说了对于DML操作,可以通过反向执行所有逆操作来实现,对于语句里面的DDL,只能直接跳过。原因是一个DDL不一定有直接的逆操作。存储历程|函数|字符串ifexists(select*fromdbo.sysobjectswhereid=object_id(N[dbo].[p_stuff])andOBJECTPROPERTY(id,NIsProcedure)=1)
dropprocedure[dbo].[p_stuff]
GO/*--Ntext字段处置
摹拟字符串处置函数stuff
完成表中ntext字段的stuff处置
注重,表中必要有列名为:id的主键(或标识字段),数据范例为int
假如没有这个主键字段,大概是其他范例,则对应的必要修正存储历程
--邹建2004.07--*/
/*--挪用示例
--测试数据
createtabletb(idintidentity(1,1),contentntext)
inserttbselecta;sd
unionallselecta;sdfkjas2qasdfdfsg45yhjhdfg45645a
--挪用存储历程,将第8~9的字符交换成中国
execp_stufftb,content,8,2,中国,
select*fromtb
droptabletb
--*/
createprocp_stuff
@tbnamesysname,--要处置的表名
@fdnamesysname,--text/ntext字段名
@startint=null,--入手下手地位,NULL暗示追加数据
@lengthint=null,--交换的长度
@strnvarchar(4000),--要拔出的字符串
@wherenvarchar(1000)=--要处置的纪录的前提
as
if@strisnullreturn
declare@snvarchar(4000)
set@s=
declare@idint,@ptrvarbinary(16),@start1int
declaretbcursorlocalfor
selectid,start=datalength([+@fdname+])/2
from[+@tbname+]
+caseisnull(@where,)whenthen
elsewhere+@whereend+
opentb
fetchtbinto@id,@start1
while@@fetch_status=0
begin
select@ptr=textptr(content)
from[+@tbname+]
whereid=@id
if@startisnullor@start1<@start
updatetext[+@tbname+].[+@fdname+]@ptrnullnull@str
else
begin
set@start1=@start-1
updatetext[+@tbname+].[+@fdname+]@ptr@start1@length@str
end
fetchtbinto@id,@start1
end
closetb
deallocatetb
execsp_executesql@s
,N@startint,@lengthint,@strnvarchar(4000)
,@start,@length,@str
go
这章描述如何检查和处理在MySQL数据库中的数据损坏。如果你的表损坏很多,你应该尝试找出其原因!见G.1调试一个MySQL服务器。 |
|