China Community Server的删除子孙贴的存储过程

本文探讨了CommunityServer中删除所有跟贴时遇到的问题,并提供了解决方案。原存储过程仅能删除直接子级跟贴,导致更深层次的回复未被清除。文中详细介绍了两种改进方法:递归调用与非递归更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

下载了宝玉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里去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值