View difference between Paste ID: xmP16Tz3 and AhjEBbH8
SHOW: | | - or go back to the newest paste.
1
USE [master]
2
GO
3
CREATE DATABASE [WWWConference]
4
 CONTAINMENT = NONE
5
 ON  PRIMARY
6
( NAME = N'WWWConference', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\WWWConference_Data', SIZE =25600KB , MAXSIZE = 102400KB , FILEGROWTH = 10%)
7
 LOG ON
8
( NAME = N'WWWConference_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\WWWConference_Log' , SIZE =25600KB , MAXSIZE = 51200KB , FILEGROWTH = 20%)
9
GO
10
ALTER DATABASE [WWWConference] SET COMPATIBILITY_LEVEL = 120
11
GO
12
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
13
begin
14
EXEC [WWWConference].[dbo].[sp_fulltext_database] @action = 'enable'
15
end
16
GO
17
ALTER DATABASE [WWWConference] SET ANSI_NULL_DEFAULT OFF
18
GO
19
ALTER DATABASE [WWWConference] SET ANSI_NULLS OFF
20
GO
21
ALTER DATABASE [WWWConference] SET ANSI_PADDING OFF
22
GO
23
ALTER DATABASE [WWWConference] SET ANSI_WARNINGS OFF
24
GO
25
ALTER DATABASE [WWWConference] SET ARITHABORT OFF
26
GO
27
ALTER DATABASE [WWWConference] SET AUTO_CLOSE OFF
28
GO
29
ALTER DATABASE [WWWConference] SET AUTO_SHRINK OFF
30
GO
31
ALTER DATABASE [WWWConference] SET AUTO_UPDATE_STATISTICS ON
32
GO
33
ALTER DATABASE [WWWConference] SET CURSOR_CLOSE_ON_COMMIT OFF
34
GO
35
ALTER DATABASE [WWWConference] SET CURSOR_DEFAULT  GLOBAL
36
GO
37
ALTER DATABASE [WWWConference] SET CONCAT_NULL_YIELDS_NULL OFF
38
GO
39
ALTER DATABASE [WWWConference] SET NUMERIC_ROUNDABORT OFF
40
GO
41
ALTER DATABASE [WWWConference] SET QUOTED_IDENTIFIER OFF
42
GO
43
ALTER DATABASE [WWWConference] SET RECURSIVE_TRIGGERS OFF
44
GO
45
ALTER DATABASE [WWWConference] SET  DISABLE_BROKER
46
GO
47
ALTER DATABASE [WWWConference] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
48
GO
49
ALTER DATABASE [WWWConference] SET DATE_CORRELATION_OPTIMIZATION OFF
50
GO
51
ALTER DATABASE [WWWConference] SET TRUSTWORTHY OFF
52
GO
53
ALTER DATABASE [WWWConference] SET ALLOW_SNAPSHOT_ISOLATION OFF
54
GO
55
ALTER DATABASE [WWWConference] SET PARAMETERIZATION SIMPLE
56
GO
57
ALTER DATABASE [WWWConference] SET READ_COMMITTED_SNAPSHOT OFF
58
GO
59
ALTER DATABASE [WWWConference] SET HONOR_BROKER_PRIORITY OFF
60
GO
61
ALTER DATABASE [WWWConference] SET RECOVERY SIMPLE
62
GO
63
ALTER DATABASE [WWWConference] SET  MULTI_USER
64
GO
65
ALTER DATABASE [WWWConference] SET PAGE_VERIFY CHECKSUM  
66
GO
67
ALTER DATABASE [WWWConference] SET DB_CHAINING OFF
68
GO
69
ALTER DATABASE [WWWConference] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF )
70
GO
71
ALTER DATABASE [WWWConference] SET TARGET_RECOVERY_TIME = 0 SECONDS
72
GO
73
ALTER DATABASE [WWWConference] SET DELAYED_DURABILITY = DISABLED
74
GO
75
EXEC sys.sp_db_vardecimal_storage_format N'WWWConference', N'ON'
76
GO
77
 
78
USE [WWWConference]
79
GO
80
 
81
 --Create users
82
CREATE LOGIN moder WITH PASSWORD = 'moder'
83
CREATE USER moder FOR LOGIN moder
84
GO
85
86
 --Create roles
87
CREATE ROLE administrator
88
GRANT INSERT, SELECT, UPDATE, DELETE
89
    ON messages, users, users_pending_review
90
    TO administrator
91
EXEC sp_addrolemember 'administrator', 'moder'
92
GO
93
94
CREATE ROLE www_user
95
GRANT INSERT
96
    ON messages, users_pending_review
97
    TO www_user
98
99
GRANT SELECT 
100
	ON messages
101
    TO www_user
102
103
CREATE ROLE guest
104
GRANT SELECT
105
	ON messages 
106
	TO guest
107
108
-- Create schemas
109
 
110
-- Create tables
111
SET ANSI_NULLS ON
112
GO
113
SET QUOTED_IDENTIFIER ON
114
GO
115
CREATE TABLE messages
116
(
117
    id INTEGER NOT NULL,
118
    topic VARCHAR(255) NOT NULL,
119
    text VARCHAR(1000) NOT NULL,
120
    date DATE NOT NULL,
121
    parent INTEGER,
122
    author INTEGER NOT NULL,
123
    PRIMARY KEY(id)
124
);
125
GO
126
SET ANSI_NULLS ON
127
GO
128
SET QUOTED_IDENTIFIER ON
129
GO
130
CREATE TABLE users
131
(
132
    id INTEGER NOT NULL,
133
    username VARCHAR(255) NOT NULL,
134
    password VARCHAR(255) NOT NULL,
135
    fullname VARCHAR(255) NOT NULL,
136
	birth_date DATE,
137
	email VARCHAR (255),
138
    PRIMARY KEY(id)
139
);
140
GO
141
SET ANSI_NULLS ON
142
GO
143
SET QUOTED_IDENTIFIER ON
144
GO
145
CREATE TABLE users_pending_review
146
(
147
    primary_key INTEGER NOT NULL,
148
    username VARCHAR(255) NOT NULL,
149
    password VARCHAR(255) NOT NULL,
150
    fullname VARCHAR(255) NOT NULL,
151
	birth_date DATE,
152
	email VARCHAR (255),
153
    PRIMARY KEY(primary_key)
154
);
155
GO
156
 
157
-- Create FKs
158
ALTER TABLE messages
159
    ADD    FOREIGN KEY (author)
160
    REFERENCES users(primary_key)
161
   --MATCH SIMPLE
162
;
163
GO    
164
ALTER TABLE messages
165
    ADD    FOREIGN KEY (parent)
166
    REFERENCES messages(id)
167
   -- MATCH SIMPLE
168
;
169
GO  
170
 
171
-- Create Indexes
172
CREATE INDEX full_text ON messages (text, topic, author);
173
GO
174
175
--Create Views
176
CREATE VIEW short_message_review AS
177
	SELECT id, topic, author, date
178
	FROM messages
179
180
--Create functions
181
--Функция на добавление сообщения с созданием новой темы. @text - текст сообщения, @topic - тема.
182
CREATE FUNCTION new_topic (@text varchar (1000), @topic varchar (256))
183
AS
184
BEGIN
185
	DECLARE @author int
186
	SET @author = SELECT FIRST(id) FROM users WHERE username = USER_NAME ()
187
	INSERT INTO messages (topic, text, date, author)
188
	VALUES (@topic, @text, GETDATE(), @author)	
189
END
190
GO
191
192
--Функция на добавление ответа к уже созданному сообщению. @text - текст сообщения, @parent_id - id сообщения, на который дается ответ
193
CREATE FUNCTION reply_message (@text varchar (1000), @parent_id int)
194
AS
195
BEGIN
196
	DECLARE @author int
197
	DECLARE @topic varchar (255)
198
	SET @author = SELECT FIRST(id) FROM users WHERE username = USER_NAME ()
199
    SET @topic = 'RE:' + 
200
				(SELECT FIRST(topic) FROM messages WHERE id = @parent_id)
201
	INSERT INTO messages (topic, text, date, author, parent)
202
	VALUES (@topic, @text, GETDATE(), @author, @parent_id)	
203
END
204
GO
205
 
206
--Функция отправки зароса на регистрацию. @username - имя пользователя, @password - пароль. @fullname - полное имя
207
--@email - адрес электронной почты, @birth_date - дата рождения. Возвращает 1, если пользователь с таким userame уже есть в таблице, иначе - 0.
208
CREATE FUNCTION require_registration (@username varchar (255), @password varchar (255), @fullname varchar (255), @email varchar (255), @birth_date DATE)
209
RETURNS int
210
AS
211
BEGIN
212
	IF EXISTS (SELECT * FROM users WHERE username = @username)
213
	BEGIN
214
		PRINT N'User with such name has already been registered';
215
		RETURN 1
216
	END
217
	ELSE
218
	BEGIN
219
		INSERT INTO users_pending_review (username, password, fullname, email, birth_date)
220
		VALUES (@username, @password, @fullname, @email, @birth_date)
221
		RETURN 0
222
	END
223
END
224
GO
225
226
227
--Функция для подтверждения регистрации пользователя с id @id из таблицы users_pending_review. Возвращает 0, если успешно, 1 - если неуспешно
228
CREATE FUNCTION confirm_registration (@id int)
229
RETURNS int
230
AS
231
BEGIN
232
	DECLARE @user_exists int
233
	DECLARE @username, @password, @fullname, @email varchar (255)
234
	DECLARE @birth_date DATE
235
	SET @username = SELECT FIRST (username) FROM users_pending_review WHERE id = @id
236
	SET @password = SELECT FIRST (password) FROM users_pending_review WHERE id = @id
237
	SET @fullname = SELECT FIRST (fullname) FROM users_pending_review WHERE id = @id
238
	SET @birth_date = SELECT FIRST (birth_date) FROM users_pending_review WHERE id = @id
239
	IF EXISTS (SELECT * FROM users WHERE username = @username)
240
	BEGIN
241
		PRINT N'User with such name has already been registered';
242
		RETURN 1
243
	END
244
	ELSE
245
	BEGIN
246
		CREATE LOGIN @username WITH PASSWORD = @password
247
		CREATE USER @username FOR LOGIN @username
248
		exec sp_addrolemember 'www_user', username
249
		INSERT INTO users (username, password, fullname, email, birth_date)
250
		VALUES (@username, @password, @fullname, @email, @birth_date)
251
		DELETE FROM users_pending_review
252
		WHERE id = @id
253
		RETURN 0
254
	END
255
END
256
GO
257
258
--Функция, возвращающая текст сообщения по id
259
CREATE FUNCTION get_text_message (@id int)
260
RETURNS varchar (1000)
261
AS
262
	RETURN (SELECT text FROM messages WHERE id = @id)
263
GO
264
265
--Функция, блокирующая доступ пользователя с логином @username к добавлению сообщений
266
CREATE FUNCTION block_user (@username varchar (255))
267
AS
268
DENY INSERT
269
	ON messages 
270
	TO @username
271
GO
272
273
--Функция, разблокирующая доступ пользователя с логином @username к добавлению сообщений
274
CREATE FUNCTION block_user (@username varchar (255))
275
AS
276
GRANT INSERT
277
	ON messages 
278
	TO @username
279
GO
280
281
--Функция, удаляющая сообщение с номером @id из таблицы
282
CREATE FUNCTION delete_message (@id int)
283
AS
284
	DELETE FROM messages
285
	WHERE id = @id
286
GO
287
288
--Функция поиска по слову в теме
289
CREATE FUNCTION search_in_topic (@word varchar (255))
290
AS
291
	SELECT * FROM messages where topic LIKE '%' + @word + '%'
292
GO
293
294
295
--Функция поиска по слову в тексте
296
CREATE FUNCTION search_in_text (@word varchar (255))
297
AS
298
	SELECT * FROM messages where text LIKE '%' + @word + '%'
299
GO
300
301
302
--Функция поиска по автору
303
CREATE FUNCTION search_in_author (@word varchar (255))
304
AS
305
	SELECT * FROM messages where author LIKE '%' + @word + '%'
306
GO
307
308
--create procedures
309
--Процедура вывода списка сообщений
310
CREATE PROCEDURE review_messages
311
AS
312
	SELECT * FROM short_messages_review
313
	GROUP BY parent_id
314
GO
315
316
317
--create triggers
318
CREATE TRIGGER delete_trigger
319
ON messages
320
AFTER DELETE
321
AS
322
	DELETE FROM messages
323
	WHERE parent_id = (SELECT FIRST(id) FROM deleted)
324
GO
325
326
327
USE [master]
328
GO
329
ALTER DATABASE [WWWConference] SET  READ_WRITE
330
GO