当前位置:文档之家› BBS论坛项目需求文档(第三阶段)

BBS论坛项目需求文档(第三阶段)

BBS项目需求文档(第三阶段)【存储过程、触发器】需求10:/* 为了维护论坛环境的"空气清新",斑竹会定期检查帖子或核实网友对某个帖子的投诉,然后删除不合法的发帖*/-- 删除帖子-- 主题:什么是.NET?-- 内容:我靠!微软的.NET广告超过了半个北京城啊.请使用T-SQL语句实现以下规则:被删帖的贴住(心酸果冻)积分减去100分跟(回)贴的贴主减去50分(回帖者没检举,涉嫌包庇并支持“犯罪”,所以减分)。

帖子所在版块的主贴量– 1视情节轻重给予贴主(心酸果冻)警告:如果回帖量> 10 负面影响较大给予严重警告;否则给予一般警告。

删掉主贴和跟帖(由于约束的限制,需要先删除跟帖,再删除主贴)所有用户重新排名如图所示:select*from bbsTopicselect*from bbsUsersselect*from bbsReplyselect*from bbsSectiondeclare@tid intdeclare@uidt intselect@tid=TID,@uidt=TUID from bbsTopic where TTopic like'%什么是.NET啊%'--帖主分数-100update bbsUsers set Upoint=Upoint-100--跟贴的帖主分数-50update bbsUsers set Upointdelete from bbsTopic where TID=@tidselect*from bbsReply where RTID=1需求12: 存储过程目标:使用存储过程实现:查看某个用的发帖和回帖情况获取用的发帖数和回帖数情况查看指定帖子的回帖数量前一阶段使用事物模拟银行的转账、取款和存款业务并使用视图和索引,方便BBS的论坛排名论坛管理中经常需要评选奖项或调查某个用发表的言论。

本阶段将使用存储过程简化这些常规的管理操作:诸如查询某个用的发帖情况查询某个帖子的回帖情况等。

调用存储过程查看用户表(bbsUsers)的相关信息。

分析:查看表的约束、索引等可调用相关的系统存储过程;创建文件夹并查看某个文件夹下的文件,可调用xp_cmdshell扩展存储过程。

use bbsDBgoexec sp_helpconstraint bbsUsers --查看表bbsUsers的约束exec sp_helpindex bbsUsers --查看表bbsUsers的索引gouse mastergoexec xp_cmdshell 'mkdir e: est',no_output --在e:下创建文件夹testexec xp_cmdshell 'dir e:'--查看文件夹需求13:创建带参数的存储过程在进行论坛的奖项评选或调查某个用户发表的言论情况,都需要经常查找用户的发帖情况(发主贴和回帖)。

请编写存储过程proc_find1,实现查找某个用户(假定为可卡因)的发帖情况。

如图所示:分析:查询某个用的发帖情况显然在创建春错过程是需要将用户作为输入参数,调用时指定具体的用户。

参考代码/*13创建带参数的存储过程*/--编写存储过程proc_find1,实现查找某个用户的发贴情况use bbsDBgoif exists(select*from sysobjects where name='proc_find1')drop procedure proc_find1gocreate procedure proc_find1@userName varchar(10) --输入参数用户名asset nocount on--获取用户对应的用户编号UIDdeclare@userID varchar(10)select@userID=UID from bbsUsers where Unam e=@userNam e--如果在主帖表中存在该用户发表的主帖if exists(select*from bbsTopic where TuID=@userID)beginprint@userName+'发表的主帖如下:'select发贴时间=convert(varchar(10),TTime,111),点击率=TClickCount,主题=TTopic,内容=Tcontents from bbsTopic where TUID=@userIDendelseprint@userName+'没有发表过主帖'if exists(select*from bbsReply where RUID=@userID)beginprint@userName+'发表的回帖如下:'select发帖时间=convert(varchar(10),RTime,111),点击率=RClickCount,回帖内容=Rcontents from bbsReply where RUID=@userIDendelseprint@userName+'没有发表过回帖'go/*调用存储过程*/exec proc_find1 '心酸果冻'需求14 /*创建带返回值的存储过程*/--编写存储过程proc_find2,查找某个用户的发贴情况,并返回发贴数和回帖数如图所示:分析:本例需要返回发帖数和回帖数,所以应在存储过程proc_find1的基础上,添加两个输出参数其关键字为OUTPUT 在上例的未尾,复制proc_find1的语句然后再做部分修改即可。

参考代码:/*14--------.带返回值的存储过程-----------*/IF EXISTS(SELECT*FROM sysobjects WHERE name='proc_find2')DROP PROCEDURE proc_find2GOCREATE PROCEDURE proc_find2@userName varchar(10),@sumTopic INT OUTPUT,@sumReply INT OUTPUTASSET NOCOUNT ONDECLARE @userID varchar(10)SELECT @userID=UID FROM bbsUsers WHERE Uname=@userName --获取心酸果冻的用户编号IF EXISTS(SELECT*FROM bbsTopic WHERE TuID=@userID)BEGINSELECT @sumTopic=count(*)FROM bbsTopic WHERE TuID=@userIDprint @userName+'发表的主贴如下:'SELECT发贴时间=convert(varchar(10),Ttime,111),点击率=TclickCount,主题=Ttopic,内容=Tcontents FROM bbsTopic WHERE TuID=@userIDENDELSEBEGINSET @sumTopic=0print @userName+'没有发表过主贴。

'ENDIF EXISTS(SELECT*FROM bbsReply WHERE RuID=@userID)BEGINSELECT @sumReply=count(*)FROM bbsReply WHERE RuID=@userIDprint @userName+'发表的回贴如下:'SELECT回贴时间=convert(varchar(10),Rtime,111),点击率=RclickCount,回贴内容=Rcontents FROM bbsReply WHERE RuID=@userIDENDELSEBEGINSET @sumReply=0print @userName+'没有发表过回贴。

'ENDGODECLARE @sum1 INT,@sum2 INTEXEC proc_find2 '可卡因',@sum1 OUTPUT,@sum2 OUTPUTIF @sum1>=@sum2print'小弟发贴较多,看来比较喜欢打抱不平!'ELSEprint'小弟回帖较多,看来比较关心民众疾苦!'print'总贴数: '+convert(varchar(5),@sum1+@sum2 )GO需求15 使用触发器上一阶段我们提起过,为了维护论坛环境的“空气清新”版主会定期检查帖子或何时网友对某个帖子的投诉然后删除不合法的贴贴。

例如删除心酸果冻的主贴。

主题:设么是.NET啊?内容:我靠!微软的.NET广告查过半个北京城啊。

请使用T-SQL 语句实现以下业务规则。

被删帖的贴主(心酸果冻)积分减去100分回帖的贴主减去50分(回帖者没检举,涉嫌包庇并支持“犯罪”,所以减分)。

删除跟帖如图所示:分析:删除主贴引发一两串的动作,所以采用触发器比较合适。

删除的数据可以从deleted表中查找。

参考代码:USE bbsDBGOEXEC sp_helpconstraint bbsReply --请查看回帖表外键约束的名称,修改下列约束名称ALTER TABLE BBSReply DROP CONSTRAINT FK_BBSReply_BBSTopic --删除外键约束IF EXISTS(SELECT name FROM sysobjects WHERE name='trig_delete_bbsTopic') DROP TRIGGER trig_delete_bbsTopicGO--使用删除触发器实现删贴功能,删除与回帖表之间的外键约束CREATE TRIGGER trig_delete_bbsTopicON bbsTopicFOR DELETEASSET NOCOUNT ONDECLARE @userID INT,@topicID INT,@secID INTSELECT @userID=TuID,@topicID=TID,@secID=TsID FROM deleted--贴主减去分UPDATE bbsUsers SET Upoint=Upoint-100 WHERE UID=@userID--跟贴者纵容并支持犯罪,减去分UPDATE bbsUsers SET Upoint=Upoint-50 FROM bbsUsers INNERJOIN bbsReply ON bbsUsers.UID=bbsReply.RuIDWHERE bbsReply.RtID=@topicID--删掉跟贴DELETE FROM bbsReply WHERE RtID=@topicIDGOSET NOCOUNT ON--插入测试数据DECLARE @topicID INTINSERT INTO bbsTopic (TsID,TuID,Tface,Ttopic,Tcontents,Tstate) VALUES(2,3,3,'什么是.Net啊?','我靠,微软的.Net广告超过半个北京城啊。

相关主题