1 --------------------------------------
  2
--------------------------------------
  2 ---답변형 게시판 응용 프로그램
  3
---답변형 게시판 응용 프로그램
  3 --------------------------------------
  4
--------------------------------------
  4 5
  5 --[0] 답변형 게시판(Reply)용 테이블 설계
  6
--[0] 답변형 게시판(Reply)용 테이블 설계
  6 Create Table dbo.Reply
  7
Create Table dbo.Reply
  7 (
  8
(
  8 Num Int Identity(1, 1) Not Null Primary Key,         --번호
  9
    Num Int Identity(1, 1) Not Null Primary Key,         --번호
  9 Name VarChar(25) Not Null,                --이름
 10
    Name VarChar(25) Not Null,                --이름
 10 Email VarChar(100) Null,                 --이메일    
 11
    Email VarChar(100) Null,                 --이메일    
 11 Title VarChar(150) Not Null,                --제목
 12
    Title VarChar(150) Not Null,                --제목
 12 PostDate DateTime Default GetDate() Not Null,        --작성일    
 13
    PostDate DateTime Default GetDate() Not Null,        --작성일    
 13 PostIP VarChar(15) Not Null,                --작성IP
 14
    PostIP VarChar(15) Not Null,                --작성IP
 14 Content Text Not Null,                    --내용
 15
    Content Text Not Null,                    --내용
 15 Password VarChar(20) Not Null,                --비밀번호
 16
    Password VarChar(20) Not Null,                --비밀번호
 16 ReadCount Int Default 0,                --조회수
 17
    ReadCount Int Default 0,                --조회수
 17 Encoding VarChar(10) Not Null,                --인코딩(HTML/Text)
 18
    Encoding VarChar(10) Not Null,                --인코딩(HTML/Text)
 18 Homepage VarChar(100) Null,                --홈페이지
 19
    Homepage VarChar(100) Null,                --홈페이지
 19 ModifyDate DateTime Null,                --수정일    
 20
    ModifyDate DateTime Null,                --수정일    
 20 ModifyIP VarChar(15) Null,                --수정IP
 21
    ModifyIP VarChar(15) Null,                --수정IP
 21 ----------
 22
    ----------
 22 Ref Int Not Null,                    --참조(부모글)
 23
    Ref Int Not Null,                    --참조(부모글)
 23 Step Int Default 0,                    --답변깊이(레벨)
 24
    Step Int Default 0,                    --답변깊이(레벨)
 24 RefOrder Int Default 0                --답변순서
 25
    RefOrder Int Default 0                --답변순서
 25 )
 26
)
 26 Go
 27
Go
 27 28
 28 --[1]~[6] 기본 SQL문 4가지 작성
 29
--[1]~[6] 기본 SQL문 4가지 작성
 29 Select * From Reply
 30
Select * From Reply
 30 Go
 31
Go
 31 32
 32 --[7] 답변 게시판(Reply)에 글을 작성하는 저장 프로시저 : WriteReply
 33
--[7] 답변 게시판(Reply)에 글을 작성하는 저장 프로시저 : WriteReply
 33 Create Proc dbo.WriteReply
 34
Create Proc dbo.WriteReply
 34 @Name VarChar(25), 
 35
    @Name VarChar(25), 
 35 @Email VarChar(100), 
 36
    @Email VarChar(100), 
 36 @Title VarChar(150), 
 37
    @Title VarChar(150), 
 37 @PostIP VarChar(15), 
 38
    @PostIP VarChar(15), 
 38 @Content Text, 
 39
    @Content Text, 
 39 @Password VarChar(20), 
 40
    @Password VarChar(20), 
 40 @Encoding VarChar(10), 
 41
    @Encoding VarChar(10), 
 41 @Homepage VarChar(100)
 42
    @Homepage VarChar(100)
 42 As
 43
As
 43 -- 현재까지 테이블의 최대 Ref(참조) 값을 구해서,
 44
    -- 현재까지 테이블의 최대 Ref(참조) 값을 구해서,
 44 -- 그 값이 0보다 크다면, 해당 Ref + 1로 데이터 저장
 45
    -- 그 값이 0보다 크다면, 해당 Ref + 1로 데이터 저장
 45 -- Ref는 부모글의 Num 필드와는 다르다.
 46
    -- Ref는 부모글의 Num 필드와는 다르다.
 46 Declare @MaxRef Int
 47
    Declare @MaxRef Int
 47 Select @MaxRef = Max(Ref) From Reply
 48
    Select @MaxRef = Max(Ref) From Reply
 48 If @MaxRef > 0
 49
    If @MaxRef > 0
 49 Begin
 50
        Begin
 50 Insert Reply
 51
            Insert Reply
 51 (
 52
            (
 52 Name, Email, Title, PostIP, Content, 
 53
                Name, Email, Title, PostIP, Content, 
 53 Password, Encoding, Homepage, Ref    
 54
                Password, Encoding, Homepage, Ref    
 54 )
 55
            )
 55 Values
 56
            Values
 56 (
 57
            (
 57 @Name, @Email, @Title, @PostIP, @Content, 
 58
                @Name, @Email, @Title, @PostIP, @Content, 
 58 @Password, @Encoding, @Homepage, @MaxRef + 1    
 59
                @Password, @Encoding, @Homepage, @MaxRef + 1    
 59 )
 60
            )
 60 End
 61
        End
 61 Else
 62
    Else
 62 Begin
 63
        Begin
 63 Insert Reply
 64
            Insert Reply
 64 (
 65
            (
 65 Name, Email, Title, PostIP, Content, 
 66
                Name, Email, Title, PostIP, Content, 
 66 Password, Encoding, Homepage, Ref    
 67
                Password, Encoding, Homepage, Ref    
 67 )
 68
            )
 68 Values
 69
            Values
 69 (
 70
            (
 70 @Name, @Email, @Title, @PostIP, @Content, 
 71
                @Name, @Email, @Title, @PostIP, @Content, 
 71 @Password, @Encoding, @Homepage, 1    
 72
                @Password, @Encoding, @Homepage, 1    
 72 )
 73
            )
 73 End
 74
        End
 74 Go
 75
Go
 75 76
 76 --[8] 답변 게시판(Reply)에서 데이터를 읽어오는 저장 프로시저 : ListReply
 77
--[8] 답변 게시판(Reply)에서 데이터를 읽어오는 저장 프로시저 : ListReply
 77 --Drop Proc dbo.ListReply
 78
--Drop Proc dbo.ListReply
 78 Create Procedure dbo.ListReply
 79
Create Procedure dbo.ListReply
 79 As
 80
As
 80 Select * From Reply Order By Ref Desc, RefOrder Asc
 81
    Select * From Reply Order By Ref Desc, RefOrder Asc
 81 Go
 82
Go
 82 83
 83 --[9] 해당 글을 세부적으로 읽어오는 저장 프로시저 : ViewReply
 84
--[9] 해당 글을 세부적으로 읽어오는 저장 프로시저 : ViewReply
 84 Create Procedure dbo.ViewReply
 85
Create Procedure dbo.ViewReply
 85 @Num Int
 86
    @Num Int
 86 As
 87
As
 87 Update Reply Set ReadCount = ReadCount + 1 
 88
    Update Reply Set ReadCount = ReadCount + 1 
 88 Where Num = @Num
 89
    Where Num = @Num
 89 90
 90 Select * From Reply Where Num = @Num
 91
    Select * From Reply Where Num = @Num
 91 Go
 92
Go
 92 93
 93 --[10] 해당 글에 대한 비밀번호 읽어오는 저장 프로시저 : ReadPassword
 94
--[10] 해당 글에 대한 비밀번호 읽어오는 저장 프로시저 : ReadPassword
 94 Create Proc dbo.ReadPasswordReply
 95
Create Proc dbo.ReadPasswordReply
 95 @Num Int
 96
    @Num Int
 96 As 
 97
As 
 97 Select Password From Reply Where Num = @Num
 98
    Select Password From Reply Where Num = @Num
 98 Go
 99
Go
 99 100
100 --[11] 해당 글 지우는 저장 프로시저 : procDeleteReply
101
--[11] 해당 글 지우는 저장 프로시저 : procDeleteReply
101 Create Proc dbo.DeleteReply
102
Create Proc dbo.DeleteReply
102 @Num Int
103
    @Num Int
103 As
104
As
104 Delete Reply Where Num = @Num
105
    Delete Reply Where Num = @Num
105 Go
106
Go
106 107
107 --[12] 해당 글을 수정하는 저장 프로시저 : ModifyeReply
108
--[12] 해당 글을 수정하는 저장 프로시저 : ModifyeReply
108 Create Proc dbo.ModifyeReply
109
Create Proc dbo.ModifyeReply
109 @Name VarChar(25), 
110
    @Name VarChar(25), 
110 @Email VarChar(100), 
111
    @Email VarChar(100), 
111 @Title VarChar(150), 
112
    @Title VarChar(150), 
112 @ModifyIP VarChar(15), 
113
    @ModifyIP VarChar(15), 
113 @ModifyDate DateTime,
114
    @ModifyDate DateTime,
114 @Content Text, 
115
    @Content Text, 
115 @Encoding VarChar(10), 
116
    @Encoding VarChar(10), 
116 @Homepage VarChar(100),
117
    @Homepage VarChar(100),
117 @Num Int
118
    @Num Int
118 As
119
As
119 Update Reply 
120
    Update Reply 
120 Set 
121
    Set 
121 Name = @Name,
122
        Name = @Name,
122 Email = @Email,
123
        Email = @Email,
123 Title = @Title,
124
        Title = @Title,
124 ModifyIP = @ModifyIP,
125
        ModifyIP = @ModifyIP,
125 ModifyDate = @ModifyDate,
126
        ModifyDate = @ModifyDate,
126 Content = @Content,
127
        Content = @Content,
127 Encoding = @Encoding,
128
        Encoding = @Encoding,
128 Homepage = @Homepage
129
        Homepage = @Homepage
129 Where Num = @Num
130
    Where Num = @Num
130 Go
131
Go
131 132
132 --[13] 답변 게시판(Reply)에 글을 답변하는 저장 프로시저 : ReplyReply
133
--[13] 답변 게시판(Reply)에 글을 답변하는 저장 프로시저 : ReplyReply
133 --Drop Proc dbo.ReplyReply
134
--Drop Proc dbo.ReplyReply
134 Create Proc dbo.ReplyReply
135
Create Proc dbo.ReplyReply
135 @Name VarChar(25), 
136
    @Name VarChar(25), 
136 @Email VarChar(100), 
137
    @Email VarChar(100), 
137 @Title VarChar(150), 
138
    @Title VarChar(150), 
138 @PostIP VarChar(15), 
139
    @PostIP VarChar(15), 
139 @Content Text, 
140
    @Content Text, 
140 @Password VarChar(20), 
141
    @Password VarChar(20), 
141 @Encoding VarChar(10), 
142
    @Encoding VarChar(10), 
142 @Homepage VarChar(100),
143
    @Homepage VarChar(100),
143 @ParentNum Int -- 부모글의 번호 View.aspx?Num=5 이면, 5가 ParentNum 
144
    @ParentNum Int -- 부모글의 번호 View.aspx?Num=5 이면, 5가 ParentNum 
144 As
145
As
145 -- 부모글의 번호를 기준으로 Ref/Step/RefOrder 가져오기
146
    -- 부모글의 번호를 기준으로 Ref/Step/RefOrder 가져오기
146 Declare @Ref Int
147
    Declare @Ref Int
147 Declare @Step Int
148
    Declare @Step Int
148 Declare @RefOrder Int
149
    Declare @RefOrder Int
149 Select @Ref = Ref, @Step = Step, @RefOrder = RefOrder
150
    Select @Ref = Ref, @Step = Step, @RefOrder = RefOrder
150 From Reply
151
    From Reply
151 Where Num = @ParentNum
152
    Where Num = @ParentNum
152 153
153 Begin Tran 
154
    Begin Tran 
154 Update Reply
155
        Update Reply
155 Set RefOrder = RefOrder + 1
156
        Set RefOrder = RefOrder + 1
156 Where 
157
        Where 
157 Ref = @Ref 
158
            Ref = @Ref 
158 And 
159
            And 
159 RefOrder > @RefOrder
160
            RefOrder > @RefOrder
160 161
161 Insert Reply
162
        Insert Reply
162 (
163
        (
163 Name, Email, Title, PostIP, Content, Password, 
164
          Name, Email, Title, PostIP, Content, Password, 
164 Encoding, Homepage, Ref, Step, RefOrder
165
          Encoding, Homepage, Ref, Step, RefOrder
165 )
166
        )
166 Values
167
        Values
167 (
168
        (
168 @Name, @Email, @Title, @PostIP, @Content, @Password, 
169
          @Name, @Email, @Title, @PostIP, @Content, @Password, 
169 @Encoding, @Homepage, @Ref, @Step + 1, @RefOrder + 1
170
          @Encoding, @Homepage, @Ref, @Step + 1, @RefOrder + 1
170 )    
171
        )    
171 Commit Tran    
172
    Commit Tran    
172 Go
173
Go
173 --테스트URL : http://sample.redplus.net/Web/Reply/List.aspx
174
--테스트URL : http://sample.redplus.net/Web/Reply/List.aspx
174 --작성자 : 박용준(RedPlus)
175
--작성자 : 박용준(RedPlus)
175 176
176 177
177 178
178 179
179 180
180 --[0] 답변형 게시판 쿼리문 연습
181
--[0] 답변형 게시판 쿼리문 연습
181 --Drop Table dbo.ReplyTest
182
--Drop Table dbo.ReplyTest
182 Create Table dbo.ReplyTest
183
Create Table dbo.ReplyTest
183 (
184
(
184 Num Int Identity(1, 1) Primary Key Not Null, -- 번호
185
    Num Int Identity(1, 1) Primary Key Not Null, -- 번호
185 Title VarChar(150) Not Null, -- 제목
186
    Title VarChar(150) Not Null, -- 제목
186 -- ...
187
    -- ...
187 Ref Int Default 0,    --참조글(부모글;최상위글;답변이아닌글;그룹번호;Group)
188
    Ref Int Default 0,    --참조글(부모글;최상위글;답변이아닌글;그룹번호;Group)
188 Step Int Default 0, --들여쓰기(한단계 답변:한단계들여쓰기;Level;Depth)
189
    Step Int Default 0, --들여쓰기(한단계 답변:한단계들여쓰기;Level;Depth)
189 RefOrder Int Default 0 --같은 그룹내에서의 정렬순서(Position)
190
    RefOrder Int Default 0 --같은 그룹내에서의 정렬순서(Position)
190 )
191
)
191 Go
192
Go
192 --[1] 처음으로 게시판 글쓰기
193
--[1] 처음으로 게시판 글쓰기
193 Insert Into ReplyTest(Title, Ref) Values('첫번째 부모글', 1)
194
Insert Into ReplyTest(Title, Ref) Values('첫번째 부모글', 1)
194 195
195 --[2] 새로운 글 입력 : Write.aspx.cs
196
--[2] 새로운 글 입력 : Write.aspx.cs
196 Begin
197
Begin
197 Declare @MaxRef Int
198
    Declare @MaxRef Int
198 Select @MaxRef = Max(Ref) From ReplyTest
199
    Select @MaxRef = Max(Ref) From ReplyTest
199 200
200 Insert Into ReplyTest(Title, Ref)
201
    Insert Into ReplyTest(Title, Ref)
201 Values('두번째 부모글', @MaxRef + 1)
202
    Values('두번째 부모글', @MaxRef + 1)
202 End
203
End
203 204
204 --[!] 출력 
205
--[!] 출력 
205 Select * From ReplyTest Order By Ref Desc, RefOrder Asc
206
Select * From ReplyTest Order By Ref Desc, RefOrder Asc
206 207
207 --[3] 첫번째 부모글에 한단계 답변
208
--[3] 첫번째 부모글에 한단계 답변
208 Insert ReplyTest(Title, Ref, Step, RefOrder)
209
Insert ReplyTest(Title, Ref, Step, RefOrder)
209 Values('>>첫번째 부모글에 답변', 1, 0+1, 0+1)  
210
Values('>>첫번째 부모글에 답변', 1, 0+1, 0+1)  
210 211
211 --[4] 첫번째 부모글에 답변의 답변 : [3]번글의 답변
212
--[4] 첫번째 부모글에 답변의 답변 : [3]번글의 답변
212 Insert ReplyTest(Title, Ref, Step, RefOrder)
213
Insert ReplyTest(Title, Ref, Step, RefOrder)
213 Values('>>>>첫번째 부모글에 답변의 답변', 1, 2, 2)  
214
Values('>>>>첫번째 부모글에 답변의 답변', 1, 2, 2)  
214 215
215 --[5] 두번째 부모글에 답변 : [2]번글의 답변
216
--[5] 두번째 부모글에 답변 : [2]번글의 답변
216 Insert ReplyTest(Title, Ref, Step, RefOrder)
217
Insert ReplyTest(Title, Ref, Step, RefOrder)
217 Values('>>두번째 부모글에 답변', 2, 1, 1)  
218
Values('>>두번째 부모글에 답변', 2, 1, 1)  
218 219
219 --[!] 출력 
220
--[!] 출력 
220 Select * From ReplyTest Order By Ref Desc, RefOrder Asc
221
Select * From ReplyTest Order By Ref Desc, RefOrder Asc
221 222
222 --[6] 첫번째 부모글에 한단계 답변(나중에) :  [1]번 글에 답변
223
--[6] 첫번째 부모글에 한단계 답변(나중에) :  [1]번 글에 답변
223 Update ReplyTest Set RefOrder = RefOrder + 1
224
Update ReplyTest Set RefOrder = RefOrder + 1
224 Where Ref = 1 And RefOrder > 0 -- 부모글의 RefOrder(0)보다 큰 레코드 모드 업데이트
225
Where Ref = 1 And RefOrder > 0 -- 부모글의 RefOrder(0)보다 큰 레코드 모드 업데이트
225 Insert ReplyTest(Title, Ref, Step, RefOrder)
226
Insert ReplyTest(Title, Ref, Step, RefOrder)
226 Values('>>첫번째 부모글에 답변(나중에)', 1, 0+1, 0+1)  
227
Values('>>첫번째 부모글에 답변(나중에)', 1, 0+1, 0+1)  
227 228
228 --[7] [6]번 레코드에 답변
229
--[7] [6]번 레코드에 답변
229 Update ReplyTest Set RefOrder = RefOrder + 1
230
Update ReplyTest Set RefOrder = RefOrder + 1
230 Where Ref = 1 And RefOrder > 1 -- 부모글의 RefOrder(0)보다 큰 레코드 모드 업데이트
231
Where Ref = 1 And RefOrder > 1 -- 부모글의 RefOrder(0)보다 큰 레코드 모드 업데이트
231 Insert ReplyTest(Title, Ref, Step, RefOrder)
232
Insert ReplyTest(Title, Ref, Step, RefOrder)
232 Values('>>>>첫번째 부모글에 답변(나중에)의 답변', 1, 1+1, 1+1)  
233
Values('>>>>첫번째 부모글에 답변(나중에)의 답변', 1, 1+1, 1+1)  
233 234
234 --[!] 데이터 출력
235
--[!] 데이터 출력
235 Select * From ReplyTest Order By Ref Desc, RefOrder Asc
236
Select * From ReplyTest Order By Ref Desc, RefOrder Asc
236 237
237 -- 저장 프로시저화
238
-- 저장 프로시저화
238 --[1] 입력 저장 프로시저 : ReplyTestWrite.aspx
239
--[1] 입력 저장 프로시저 : ReplyTestWrite.aspx
239 Create Procedure dbo.WriteReplyTest
240
Create Procedure dbo.WriteReplyTest
240 @Title VarChar(150)
241
    @Title VarChar(150)
241 As    
242
As    
242 -- 현재까지 테이블의 최대 Ref(참조) 값을 구해서,
243
    -- 현재까지 테이블의 최대 Ref(참조) 값을 구해서,
243 -- 그 값이 0보다 크다면, 해당 Ref + 1로 데이터 저장
244
    -- 그 값이 0보다 크다면, 해당 Ref + 1로 데이터 저장
244 -- Ref는 부모글의 Num 필드와는 다르다.
245
    -- Ref는 부모글의 Num 필드와는 다르다.
245 Declare @MaxRef Int
246
    Declare @MaxRef Int
246 Select @MaxRef = Max(Ref) From ReplyTest
247
    Select @MaxRef = Max(Ref) From ReplyTest
247 If @MaxRef > 0
248
    If @MaxRef > 0
248 Begin
249
        Begin
249 Insert Into ReplyTest(Title, Ref)
250
                Insert Into ReplyTest(Title, Ref)
250 Values(@Title, @MaxRef + 1) -- MaxRef+1로 저장
251
                Values(@Title, @MaxRef + 1) -- MaxRef+1로 저장
251 End
252
        End
252 Else
253
    Else
253 Begin
254
        Begin
254 Insert Into ReplyTest(Title, Ref)
255
            Insert Into ReplyTest(Title, Ref)
255 Values(@Title, 1) -- 첫번째 레코드는 Ref를 1로 저장
256
            Values(@Title, 1) -- 첫번째 레코드는 Ref를 1로 저장
256 End
257
        End
257 Go
258
Go
258 --WriteReplyTest '첫번째 부모글'
259
--WriteReplyTest '첫번째 부모글'
259 --WriteReplyTest '두번째 부모글'
260
--WriteReplyTest '두번째 부모글'
260 261
261 --[2] 출력 저장 프로시저 : ReplyTestList.aspx
262
--[2] 출력 저장 프로시저 : ReplyTestList.aspx
262 Create Proc dbo.ListReplyTest
263
Create Proc dbo.ListReplyTest
263 As
264
As
264 Select * From ReplyTest 
265
    Select * From ReplyTest 
265 Order By Ref Desc, RefOrder Asc
266
    Order By Ref Desc, RefOrder Asc
266 Go
267
Go
267 268
268 --ListReplyTest
269
--ListReplyTest
269 --[3] 답변 저장 프로시저
270
--[3] 답변 저장 프로시저
270 --Drop Proc dbo.ReplyReplyTest
271
--Drop Proc dbo.ReplyReplyTest
271 Create Proc dbo.ReplyReplyTest
272
Create Proc dbo.ReplyReplyTest
272 @Title VarChar(150),
273
    @Title VarChar(150),
273 @ParentRef Int,            -- 부모글의 Ref
274
    @ParentRef Int,            -- 부모글의 Ref
274 @ParentStep Int,        -- 부모글의 Step
275
    @ParentStep Int,        -- 부모글의 Step
275 @ParentRefOrder Int    -- 부모글의 RefOrder
276
    @ParentRefOrder Int    -- 부모글의 RefOrder
276 As
277
As
277 Begin Tran 
278
    Begin Tran 
278 --[A] Ref가 같고, RefOrder가 부모글보다 큰 모든 답변글들의
279
        --[A] Ref가 같고, RefOrder가 부모글보다 큰 모든 답변글들의
279 -- RefOrder값을 1증가
280
        -- RefOrder값을 1증가
280 Update ReplyTest 
281
        Update ReplyTest 
281 Set RefOrder = RefOrder + 1
282
        Set RefOrder = RefOrder + 1
282 Where 
283
        Where 
283 Ref = @ParentRef 
284
            Ref = @ParentRef 
284 And 
285
            And 
285 RefOrder > @ParentRefOrder
286
            RefOrder > @ParentRefOrder
286 --[B] Ref는 부모글의 Ref를 그대로 저장
287
        --[B] Ref는 부모글의 Ref를 그대로 저장
287 -- Step은 부모글의 Step + 1로 저장
288
        -- Step은 부모글의 Step + 1로 저장
288 -- RefOrder는 부모글의 RefOrder + 1로 저장([A]에서 업데이트 후)
289
        -- RefOrder는 부모글의 RefOrder + 1로 저장([A]에서 업데이트 후)
289 Insert ReplyTest(Title, Ref, Step, RefOrder)
290
        Insert ReplyTest(Title, Ref, Step, RefOrder)
290 Values(@Title, @ParentRef, @ParentStep+1, @ParentRefOrder + 1)  
291
        Values(@Title, @ParentRef, @ParentStep+1, @ParentRefOrder + 1)  
291 Commit Tran
292
    Commit Tran
292 Go
293
Go
293