屋顶上的木帷幕

海鸥之所以追着渔船飞,是因为它们认为会有沙丁鱼抛向大海 - Eric Cantona, 1995
随笔 - 146, 评论 - 3168, 引用 - 56

导航

工具

关于


标签

每月存档

广告



访客

 

下载了宝玉China Community Server 1.02,发现删除所有跟贴的存储过程cs_system_DeletePostAndChildren只能删除所有的儿子,而孙子、曾孙等都不会被删除,但因为儿子都被删除了,所以孙子、曾孙等也不会被显示在页面上,看上去就像是被删除了一样。

出问题的代码在cs_system_DeletePostAndChildren的Ln.120-Ln.142:

-- delete all child posts, unless DeleteChildred is set to 0. IF @DeleteChildren = 1 BEGIN UPDATE cs_Posts SET SectionID = @DeletedSectionID, ThreadID = @ThreadID, PostLevel = 2, SortOrder = 2 WHERE ParentID = @PostID and SettingsID = @SettingsID -- ... END

解决方案有递归的和非递归的两种。递归的方法即层层嵌套的调用cs_system_DeletePostAndChildren删除儿子、孙子、曾孙等,不适合当帖子的回复层次很深的情况。非递归的方法是先把所有的孙子、曾孙、玄孙等都变成儿子,然后删除所有的儿子:

-- delete all child posts, unless DeleteChildred is set to 0. IF @DeleteChildren = 1 BEGIN WHILE EXISTS (SELECT PostID FROM cs_Posts WHERE ParentID in (SELECT PostID FROM cs_Posts WHERE ParentID = @PostID and PostID <> @PostID)) BEGIN UPDATE cs_Posts SET ParentID = @PostID WHERE ParentID in (SELECT PostID FROM cs_Posts WHERE ParentID = @PostID and PostID <> @PostID) END UPDATE cs_Posts SET SectionID = @DeletedSectionID, ThreadID = @ThreadID, PostLevel = 2, SortOrder = 2 WHERE ParentID = @PostID and SettingsID = @SettingsID -- ... END

宝玉说他先前也已经发现了这个问题了,答应会把修正放到China Community Server里去。


随贴广告(测试期)
相关文章

打印 | 张贴于 2005-08-04 13:50:00 | Tag:Dot NET

留言反馈

China Community Server的删除子孙贴的存储过程 编辑
Community Server中无法删除所有跟贴的原因及解决方法
2006-08-04 12:32:00 | [匿名用户:goldhawk1010]
re: Community Server中无法删除所有跟贴的原因及解决方法 编辑
我觉得觉得将贴子比做儿子,孙子很搞笑,呵呵
2005-08-05 09:07:00 | [匿名用户:lion]
re: Community Server中无法删除所有跟贴的原因及解决方法 编辑
认为每隔一段时间批量删除脏数据比较合理。

2005-08-04 17:07:00 | [匿名用户:流言]
re: Community Server中无法删除所有跟贴的原因及解决方法 编辑
不错!
2005-08-04 15:46:00 | [匿名用户:ayya__(*)hotmail.com]
re: Community Server中无法删除所有跟贴的原因及解决方法 编辑
这个While循环写的很有水平!学习了!
2005-08-04 15:02:00 | [匿名用户:宝玉]
博客主人设置本博客不允许匿名用户发表言论,请登录后再试

Powered by: Joycode MVC Blogger System