
- •Оглавление
- •Введение
- •Постановка задачи
- •Краткое описание предметной области
- •Описание таблиц базы данных
- •Описание процедур базы данных
- •Триггеры и джобы
- •Тестирование
- •Тестирование хранимых процедур и триггеров
- •Тестирование «джобов»
- •Оценка нормализации базы данных
- •Диаграмма базы данных
- •Заключение
- •Библиографический список
- •Приложение
Приложение
-----СОЗДАЕМ БАЗУ ДАННЫХ ФОРУМА-----
go
CREATE DATABASE forum
go
USE forum
-----СОЗДАЕМ ТАБЛИЦЫ-----
go
USE forum
go
--создаем таблицу личной информации пользователя--
CREATE TABLE user_info(
id_user INTEGER IDENTITY(1,1) PRIMARY KEY CLUSTERED,
db_user NVARCHAR(128) NOT NULL UNIQUE NONCLUSTERED,
nikname NVARCHAR(50) UNIQUE NOT NULL,
name NVARCHAR(50),
surname NVARCHAR(50),
email NVARCHAR(50) NOT NULL CHECK (email LIKE '%@%.%'),
birthday SMALLDATETIME CHECK (birthday < GETUTCDATE()),
city NVARCHAR(50),
telephone NVARCHAR(12) CHECK (telephone LIKE '+[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'),
sex BIT NOT NULL,
time_zone SMALLINT DEFAULT 0,
regdate SMALLDATETIME DEFAULT GETUTCDATE()
)
go
--создаем таблицу активности пользователя--
CREATE TABLE user_activity(
id_user INTEGER NOT NULL FOREIGN KEY REFERENCES user_info(id_user) ON DELETE CASCADE,
topics INTEGER NOT NULL,
answers INTEGER NOT NULL
)
go
--создаем таблицу статистики посещений пользователя--
CREATE TABLE visitor_statistic(
id_user INTEGER NOT NULL FOREIGN KEY REFERENCES user_info(id_user) ON DELETE CASCADE,
last_ip VARCHAR(48),
last_time SMALLDATETIME NOT NULL
)
go
--создаем таблицу информации о рубрике на форуме--
CREATE TABLE rubric(
title NVARCHAR(50) NOT NULL UNIQUE NONCLUSTERED,
id_rubric INTEGER IDENTITY(1,1) PRIMARY KEY CLUSTERED,
topics INTEGER DEFAULT 0,
popularity INTEGER DEFAULT 0,
author INTEGER FOREIGN KEY REFERENCES user_info(id_user) ON DELETE SET NULL,
last_change_date SMALLDATETIME DEFAULT GETUTCDATE()
)
go
--создаем таблицу информации о теме на форуме--
CREATE TABLE topic(
id_topic INTEGER IDENTITY(1,1) PRIMARY KEY CLUSTERED,
title NVARCHAR(50) NOT NULL UNIQUE NONCLUSTERED,
author INTEGER FOREIGN KEY REFERENCES user_info(id_user) ON DELETE SET NULL,
rubric INTEGER NOT NULL FOREIGN KEY REFERENCES rubric(id_rubric) ON DELETE CASCADE,
creation_date SMALLDATETIME DEFAULT GETUTCDATE(),
last_change_date SMALLDATETIME DEFAULT GETUTCDATE(),
messages_num INTEGER DEFAULT 0
)
go
--создаем таблицу сообщений на форуме--
CREATE TABLE message_info(
id_message INTEGER IDENTITY(1,1) PRIMARY KEY CLUSTERED,
src_user INTEGER FOREIGN KEY REFERENCES user_info(id_user) ON DELETE SET NULL,
message_date SMALLDATETIME DEFAULT GETUTCDATE(),
message_text NTEXT,
topic INTEGER NOT NULL FOREIGN KEY REFERENCES topic(id_topic) ON DELETE CASCADE
)
go
--создаем таблицу заблокированных пользователей--
CREATE TABLE black_list(
id_user INTEGER NOT NULL FOREIGN KEY REFERENCES user_info(id_user) ON DELETE CASCADE,
reason_text NVARCHAR(50) NOT NULL,
date_begin SMALLDATETIME DEFAULT GETUTCDATE(),
date_end SMALLDATETIME NOT NULL CHECK(date_end > GETUTCDATE())
)
go
--создаем таблицу групп--
CREATE TABLE group_info(
id_group INTEGER IDENTITY(1,1) PRIMARY KEY CLUSTERED,
author INTEGER FOREIGN KEY REFERENCES user_info(id_user) ON DELETE SET NULL,
group_date SMALLDATETIME DEFAULT GETUTCDATE(),
title NVARCHAR(50) NOT NULL UNIQUE NONCLUSTERED
)
go
--создаем таблицу голосований--
CREATE TABLE votes(
id_vote INTEGER IDENTITY(1,1) PRIMARY KEY CLUSTERED,
question NVARCHAR(150) NOT NULL,
author INTEGER FOREIGN KEY REFERENCES user_info(id_user) ON DELETE SET NULL,
id_group INTEGER NOT NULL FOREIGN KEY REFERENCES group_info(id_group) ON DELETE CASCADE,
date_begin SMALLDATETIME DEFAULT GETUTCDATE(),
date_end SMALLDATETIME NOT NULL CHECK(date_end > GETUTCDATE())
)
go
--создаем таблицу ответов--
CREATE TABLE answers(
id_answer INTEGER IDENTITY(1,1) PRIMARY KEY CLUSTERED,
vote INTEGER NOT NULL FOREIGN KEY REFERENCES votes(id_vote) ON DELETE CASCADE,
ans_number TINYINT NOT NULL,
ans_text NVARCHAR(150),
quantity INTEGER DEFAULT 0
)
go
--создаем таблицу принадлежности пользователя группе--
CREATE TABLE user_group(
id_user INTEGER NOT NULL FOREIGN KEY REFERENCES user_info(id_user) ON DELETE CASCADE,
id_group INTEGER NOT NULL FOREIGN KEY REFERENCES group_info(id_group) ON DELETE CASCADE
)
go
--талица истории лучших пользователей--
CREATE TABLE best_users(
id_user INTEGER NOT NULL FOREIGN KEY REFERENCES user_info(id_user) ON DELETE CASCADE,
points INTEGER NOT NULL,
choise_date SMALLDATETIME NOT NULL
)
------------------------------------СОЗДАЕМ ТРИГЕРЫ--------------------------------------
go
------------------тригер, выполняющийся при добавлении пользователя в базу---------------
CREATE TRIGGER AddUserTrigger
ON user_info
AFTER INSERT
AS
INSERT INTO user_activity (id_user, topics, answers)
SELECT id_user, 0, 0
FROM inserted
INSERT INTO visitor_statistic (id_user, last_ip, last_time)
SELECT id_user, CAST(CONNECTIONPROPERTY('client_net_address') AS VARCHAR(48)), GETUTCDATE()
FROM inserted
go
---------------------тригер, выполняющийся при добавлении темы-------------------------
CREATE TRIGGER AddTopicTrigger
ON topic
AFTER INSERT
AS
declare @cnt int
UPDATE rubric SET topics = topics + (SELECT COUNT(*)
FROM inserted
WHERE rubric.id_rubric = rubric)
UPDATE rubric SET last_change_date = GETUTCDATE()
WHERE id_rubric IN (SELECT rubric
FROM inserted)
UPDATE user_activity SET topics = topics + (SELECT COUNT(*)
FROM inserted
WHERE user_activity.id_user = author)
go
-----------------------тригер, выполняющийся при добавлении сообщения---------------------
CREATE TRIGGER AddMessageTrigger
ON message_info
AFTER INSERT
AS
UPDATE topic SET messages_num = messages_num + (SELECT COUNT(*)
FROM inserted
WHERE topic.id_topic = topic)
UPDATE topic SET last_change_date = GETUTCDATE()
WHERE id_topic IN (SELECT topic
FROM inserted)
UPDATE user_activity SET answers = answers + (SELECT COUNT(*)
FROM inserted
WHERE user_activity.id_user = src_user)
UPDATE rubric SET popularity = popularity + (SELECT COUNT(*)
FROM topic INNER JOIN inserted ON topic.id_topic = inserted.topic
WHERE rubric.id_rubric = rubric)
UPDATE rubric SET last_change_date = GETUTCDATE()
WHERE id_rubric IN (SELECT rubric
FROM topic AS t inner join inserted AS i
ON t.id_topic = i.topic)
---------------------СОЗДАЕМ ХРАНИМЫЕ ПРОЦЕДУРЫ-------------------------
------------------------Интерфейсные процедуры--------------------------
go
-----------------процедура добавления пользователя---------------------
CREATE PROCEDURE AddUser
@nikname NVARCHAR(50),
@passwd NVARCHAR(15),
@name NVARCHAR(50) = NULL,
@surname NVARCHAR(50) = NULL,
@email NVARCHAR(50),
@birthday SMALLDATETIME = NULL,
@city NVARCHAR(50) = NULL,
@telephone NVARCHAR(12) = NULL,
@sex BIT,
@time_zone SMALLINT
AS
DECLARE @result BIT,
@db_user NVARCHAR(128)
SELECT @db_user = 'user_' + @nikname
EXEC @result = sp_addlogin @db_user, @passwd, 'forum'
IF @result = 1
BEGIN
PRINT 'Login can not be created'
RETURN
END
EXEC @result = sp_adduser @db_user, @db_user, 'user_role'
IF @result = 1
BEGIN
EXEC sp_droplogin @db_user
PRINT 'User can not be created'
RETURN
END
INSERT INTO user_info (db_user,nikname,name,surname,email,birthday,city,telephone,sex,time_zone)
VALUES (@db_user,@nikname,@name,@surname,@email,@birthday,@city,@telephone,@sex,@time_zone)
IF @@ROWCOUNT = 0
BEGIN
EXEC sp_droplogin @db_user
EXEC sp_dropuser @db_user
PRINT 'Record can not be created'
RETURN
END
go
-------------------процедура удаления пользователя-----------------------
CREATE PROCEDURE DeleteUser
@nikname NVARCHAR(50)
AS
DECLARE @db_user NVARCHAR(128),@result BIT
SELECT @db_user = 'user_' + @nikname
EXEC @result = sp_droplogin @db_user
IF @result = 1
BEGIN
PRINT 'Login can not be deleted'
END
EXEC @result = sp_dropuser @db_user
IF @result = 1
BEGIN
PRINT 'User can not be deleted'
END
DELETE FROM user_info
WHERE @db_user = db_user
IF @@ROWCOUNT = 0
BEGIN
PRINT 'Record can not be deleted'
END
go
---------------------процедура просмотра личной информации----------------------
CREATE PROCEDURE ShowPrivateInfo
AS
SELECT *
FROM user_info
WHERE USER_NAME() = db_user
go
---------------------процедура изменения личной информации----------------------
CREATE PROCEDURE ChangePrivateInfo
@name NVARCHAR(50) = NULL,
@surname NVARCHAR(50) = NULL,
@email NVARCHAR(50) = NULL,
@birthday SMALLDATETIME = NULL,
@city NVARCHAR(50) = NULL,
@telephone NVARCHAR(12) = NULL,
@sex BIT = NULL,
@time_zone SMALLINT = NULL
AS
UPDATE user_info SET
name = CASE
WHEN @name IS NULL THEN name
WHEN @name IS NOT NULL THEN @name
END,
surname = CASE
WHEN @name IS NULL THEN surname
WHEN @name IS NOT NULL THEN @surname
END,
email = CASE
WHEN @email IS NULL THEN email
WHEN @email IS NOT NULL THEN @email
END,
birthday = CASE
WHEN @birthday IS NULL THEN birthday
WHEN @birthday IS NOT NULL THEN @birthday
END,
city = CASE
WHEN @city IS NULL THEN city
WHEN @city IS NOT NULL THEN @city
END,
telephone = CASE
WHEN @telephone IS NULL THEN telephone
WHEN @telephone IS NOT NULL THEN @telephone
END,
sex = CASE
WHEN @sex IS NULL THEN sex
WHEN @sex IS NOT NULL THEN @sex
END,
time_zone = CASE
WHEN @time_zone IS NULL THEN time_zone
WHEN @time_zone IS NOT NULL THEN @time_zone
END
WHERE USER_NAME() = db_user
IF @@ROWCOUNT = 0
BEGIN
PRINT 'Information was not updated'
END
go
-------------------процедура добавления пользователя в "черный список"-------------------
CREATE PROCEDURE AddUserToBlackList
@nikname NVARCHAR(50),
@reason_text NVARCHAR(50),
@date_end SMALLDATETIME = NULL
AS
IF EXISTS (SELECT *
FROM black_list AS bl INNER JOIN user_info AS ui
ON bl.id_user = ui.id_user AND ui.nikname = @nikname)
UPDATE black_list SET date_end = CASE
WHEN @date_end IS NULL THEN '2079-06-06'
ELSE @date_end
END
ELSE
INSERT INTO black_list(id_user,reason_text,date_end)
VALUES ((SELECT id_user
FROM user_info
WHERE @nikname = nikname), @reason_text,CASE
WHEN @date_end IS NULL THEN '2079-06-06'
ELSE @date_end
END)
IF @@ROWCOUNT = 0
BEGIN
PRINT 'Information was not updated'
END
go
-------------------------------процедура создания группы----------------------------------
CREATE PROCEDURE CreateGroup
@title NVARCHAR(50)
AS
INSERT INTO group_info (title, author)
VALUES (@title, (SELECT id_user
FROM user_info
WHERE USER_NAME() = db_user))
IF @@ROWCOUNT = 0
BEGIN
PRINT 'Group was not created'
END
go
----------------------процедура добавления пользователя в группу-------------------------
CREATE PROCEDURE JoinGroup
@groupname NVARCHAR(50)
AS
INSERT INTO user_group (id_user, id_group)
VALUES ((SELECT id_user
FROM user_info
WHERE USER_NAME() = db_user), ( SELECT id_group
FROM group_info
WHERE @groupname = title))
IF @@ROWCOUNT = 0
BEGIN
PRINT 'User was not added to group'
END
go
-----------------------------процедура создания сообщения---------------------------------
CREATE PROCEDURE CreateMessage
@message_text NTEXT,
@title NVARCHAR(50)
AS
INSERT INTO message_info (src_user,message_text,topic)
VALUES ((SELECT id_user
FROM user_info
WHERE USER_NAME() = db_user), @message_text, (SELECT id_topic
FROM topic
WHERE @title = title))
IF @@ROWCOUNT = 0
BEGIN
PRINT 'Message was not created'
END
go
----------------------------------процедура создания темы---------------------------------
CREATE PROCEDURE CreateTopic
@title NVARCHAR(50),
@rubric NVARCHAR(50)
AS
INSERT INTO topic (title,author,rubric)
VALUES (@title, (SELECT id_user
FROM user_info
WHERE USER_NAME() = db_user), (SELECT id_rubric
FROM rubric
WHERE title = @rubric))
IF @@ROWCOUNT = 0
BEGIN
PRINT 'Topic was not created'
END
go
--------------------------------процедура создания рубрики-------------------------------
CREATE PROCEDURE CreateRubric
@title NVARCHAR(50)
AS
INSERT INTO rubric (title,author)
VALUES (@title, (SELECT id_user
FROM user_info
WHERE USER_NAME() = db_user))
IF @@ROWCOUNT = 0
BEGIN
PRINT 'Rubric was not created'
END
go
----------------------------процедура создания голосования-------------------------------
CREATE PROCEDURE CreateVote
@question NVARCHAR(150),
@group NVARCHAR(50),
@date_end SMALLDATETIME = NULL
AS
INSERT INTO votes (question, author, id_group, date_end)
VALUES (@question, (SELECT id_user
FROM user_info
WHERE USER_NAME() = db_user), (SELECT id_group
FROM group_info
WHERE @group = title), CASE
WHEN @date_end IS NULL THEN '2079-06-06'
ELSE @date_end
END)
IF @@ROWCOUNT = 0
BEGIN
PRINT 'Vote was not created'
END
go
-----------------------процедура создания ответов на голосование-------------------------
CREATE PROCEDURE AddAnswer
@vote INTEGER,
@ans_text NVARCHAR(50)
AS
DECLARE @user NVARCHAR(50), @num INTEGER
SELECT @user = ui.db_user
FROM user_info AS ui INNER JOIN votes AS v
ON v.id_vote = @vote AND ui.id_user = v.author
IF @user <> USER_NAME()
BEGIN
PRINT 'Access deny'
RETURN
END
SELECT @num = COUNT(*) + 1
FROM answers
WHERE @vote = vote
INSERT INTO answers (vote,ans_number,ans_text)
VALUES(@vote,@num,@ans_text)
go
------------------------процедура дачи ответа на голосование----------------------------
CREATE PROCEDURE VoteCast
@vote INTEGER,
@ans_number TINYINT
AS
UPDATE answers SET quantity = quantity + 1
WHERE vote = @vote AND ans_number = @ans_number
go
-----------------процедура удаления пользователя из группы-------------------------------
CREATE PROCEDURE LeaveGroup
@group NVARCHAR(50)
AS
DELETE FROM user_group
WHERE id_user IN (SELECT id_user
FROM user_info
WHERE db_user = USER_NAME()) AND id_group IN (SELECT id_group
FROM group_info
WHERE title = @group)
go
--------------------процедура удаления сообщения(для модераторов)------------------------
CREATE PROCEDURE DeleteMessage
@id_message INTEGER
AS
DELETE FROM message_info
WHERE id_message = @id_message
go
------------------процедура удаления сообщения из собственной темы-----------------------
CREATE PROCEDURE DeleteMessageFromOwnTopic
@id_message INTEGER
AS
DECLARE @user NVARCHAR(50)
SELECT @user = ui.db_user
FROM user_info AS ui INNER JOIN topic AS tp
ON ui.id_user = tp.author INNER JOIN message_info AS mi
ON mi.topic = tp.id_topic
IF @user <> USER_NAME()
BEGIN
PRINT 'Access deny'
RETURN
END
DELETE FROM message_info
WHERE id_message = @id_message
---------------------------------Процедуры-запросы-------------------------------------
go
--процедура возвращает количкство зарегистрированных в определенный период пользователей--
CREATE PROCEDURE UsersNumberInPeriod
@startdate SMALLDATETIME = '1900-01-01',
@enddate SMALLDATETIME = '2079-06-06',
@number INTEGER OUTPUT
AS
SELECT @number = COUNT (*)
FROM user_info AS ui
WHERE ui.regdate > @startdate AND ui.regdate < @enddate
go
--процедура возвращает количкство сообщений, оставленных в определенный период времени--
CREATE PROCEDURE MessagesNumber
@startdate SMALLDATETIME,
@enddate SMALLDATETIME,
@number INTEGER OUTPUT
AS
SELECT @number = COUNT (*)
FROM message_info AS mi
WHERE mi.message_date > @startdate AND mi.message_date < @enddate
go
--процедура возвращает среднее/минимальное/максимальное кол-во сообщений в день/месяц/год--
CREATE PROCEDURE MessagesNumberStatistic
@agrigatetype TINYINT, --1 - min, 2 - max, 3 - avg
@periodtype TINYINT, --1 - day, 2 - month, 3 - year
@number INTEGER OUTPUT
AS
SELECT @number = CASE @agrigatetype
WHEN 1 THEN MIN(cnt)
WHEN 2 THEN MAX(cnt)
WHEN 3 THEN AVG(cnt)
END
FROM (SELECT COUNT(*) cnt
FROM message_info
GROUP BY CASE @periodtype
WHEN 1 THEN DAY(message_date)
WHEN 2 THEN MONTH(message_date)
WHEN 3 THEN YEAR(message_date)
END
) AS SUB
go
--процедура возвращает таблицу статистики активности пользователей на форуме--
CREATE PROCEDURE TimeMessageStatistic
@periodtype TINYINT --1 - day, 2 - month, 3 - year
AS
SELECT CASE @periodtype
WHEN 1 THEN DAY(message_date)
WHEN 2 THEN MONTH(message_date)
WHEN 3 THEN YEAR(message_date)
END AS 'Period', COUNT(*) AS 'Sum', CAST(COUNT(*) AS FLOAT)/(SELECT COUNT(*)
FROM message_info AS 'Percentage'
FROM message_info
GROUP BY CASE @periodtype
WHEN 1 THEN DAY(message_date)
WHEN 2 THEN MONTH(message_date)
WHEN 3 THEN YEAR(message_date)
END
go
--процедура обносвляет таблицу лучших пользователей форума--
CREATE PROCEDURE UpdateUserStatistic
AS
INSERT INTO best_users (id_user, points,choise_date)
SELECT TOP 10 id_user, answers, GETUTCDATE()
FROM user_activity
ORDER BY answers
go
--процедура удаляет пустые темы, на которые нет ответа в течении двух недель--
CREATE PROCEDURE DeleteTopics
AS
DELETE FROM topic
WHERE DATEDIFF(WEEK, last_change_date, GETUTCDATE()) >= 2 AND id_topic NOT IN
(SELECT topic
FROM message_info
GROUP BY topic
HAVING COUNT(*) > 1)
go
--процедура удаляет пользователей из "блэк-листа" по истечении времени--
CREATE PROCEDURE UnlockUsers
AS
DELETE FROM black_list
WHERE date_end < GETUTCDATE()
go
--процедура возвращает кол-во пользователей, не посещавших форум с определенного времени--
CREATE PROCEDURE UserVisitNumber
@date SMALLDATETIME,
@num INTEGER OUTPUT
AS
SELECT @num = COUNT(*)
FROM visitor_statistic
WHERE last_time < @date
go
--процедура возвращает среднее/минимальное/максимальное время блокирования пользователя--
CREATE PROCEDURE BlockTimeStatistic
@agrigatetype TINYINT, --1 - min, 2 - max, 3 - avg
@avgtime INTEGER OUTPUT
AS
SELECT @avgtime = CASE @agrigatetype
WHEN 1 THEN MIN(DATEDIFF(DAY, date_end, date_begin))
WHEN 2 THEN MAX(DATEDIFF(DAY, date_end, date_begin))
WHEN 3 THEN AVG(DATEDIFF(DAY, date_end, date_begin))
END
FROM black_list
go
--процедура возвращает среднее/минимальное/максимальное количество пользователей, участвующих в голосованиях--
CREATE PROCEDURE VoteStatistic
@agrigatetype TINYINT, --1 - min, 2 - max, 3 - avg
@num INTEGER OUTPUT
AS
SELECT @num = CASE @agrigatetype
WHEN 1 THEN MIN(answers)
WHEN 2 THEN MAX(answers)
WHEN 3 THEN AVG(answers)
END
FROM vote
go
--процедура возвращает количество пользователей, попавших в "черный список" в определенный период--
CREATE PROCEDURE BlockUsersStatistic
@startdate SMALLDATETIME,
@enddate SMALLDATETIME,
@number INTEGER OUTPUT
AS
SELECT @number = COUNT (*)
FROM black_list AS bl
WHERE bl.date_begin > @startdate AND bl.date_end < @enddate
-----СОЗДАЕМ ДЖОБЫ-----
go
USE msdb
go
--резервное копирование базы данных (каждую неделю)--
EXEC sp_add_job
@job_name = 'BackUpDatabase',
@enabled = 1,
@description = 'резервное копирование БД',
@owner_login_name = 'sa'
go
EXEC sp_add_jobstep
@job_name = 'BackUpDatabase',
@step_name = 'BackUp',
@subsystem = 'TSQL',
@command = 'BACKUP DATABASE forum TO DISK = ''c:\BackUps\forum.dat_bak''',
@retry_attempts = 5,
@retry_interval = 10
go
EXEC sp_add_jobschedule
@job_name = 'BackUpDatabase',
@name = 'BackupSchedule',
@freq_type = 8, --every week
@freq_interval = 2, --monday
@freq_recurrence_factor = 1, --every one week
@active_start_time = 050000 --5:00
EXEC sp_add_jobserver @job_name = 'BackUpDatabase', @server_name = N'(local)'
go
--определение лучшего пользователя месяца (каждый месяц)--
EXEC sp_add_job
@job_name = 'DetermineBestUser',
@enabled = 1,
@description = 'определение лучшего пользователя',
@owner_login_name = 'sa'
go
EXEC sp_add_jobstep
@job_name = 'DetermineBestUser',
@step_name = 'Determine',
@subsystem = 'TSQL',
@command = 'exec UpdateUserStatistic',
@database_name = 'forum',
@retry_attempts = 2,
@retry_interval = 2
go
EXEC sp_add_jobschedule
@job_name = 'DetermineBestUser',
@name = 'DetermineSchedule',
@freq_type = 16, --every month
@freq_interval = 1, --first day of month
@freq_recurrence_factor = 1, --every one month
@active_start_time = 220000 --22:00
EXEC sp_add_jobserver @job_name = 'DetermineBestUser', @server_name = N'(local)'
go
--удаление тем, на которые нет ни одного ответа в течение двух недель (каждую неделю)--
EXEC sp_add_job
@job_name = 'TopicsDelete',
@enabled = 1,
@description = 'удаление тем',
@owner_login_name = 'sa'
go
EXEC sp_add_jobstep
@job_name = 'TopicsDelete',
@step_name = 'Delete',
@subsystem = 'TSQL',
@command = 'exec DeleteTopics',
@database_name = 'forum',
@retry_attempts = 3,
@retry_interval = 2
go
EXEC sp_add_jobschedule
@job_name = 'TopicsDelete',
@name = 'TopicsDeleteSchedule',
@freq_type = 8, --every week
@freq_interval = 2, --monday
@freq_recurrence_factor = 1, --every one week
@active_start_time = 060000 --6:00
EXEC sp_add_jobserver @job_name = 'TopicsDelete', @server_name = N'(local)'
go
--Разблокировка пользователя согласно сроку разблокировки в «черном списке» (каждый день--
EXEC sp_add_job
@job_name = 'UnlockUsers',
@enabled = 1,
@description = 'разблокировка пользователей',
@owner_login_name = 'sa'
go
EXEC sp_add_jobstep
@job_name = 'UnlockUsers',
@step_name = 'Unlock',
@subsystem = 'TSQL',
@command = 'exec UnlockUsers',
@database_name = 'forum',
@retry_attempts = 5,
@retry_interval = 5
go
EXEC sp_add_jobschedule
@job_name = 'UnlockUsers',
@name = 'ScheduledBackup',
@freq_type = 4, --every day
@freq_interval = 1, --every day
@active_start_time = 000000 --0:00
EXEC sp_add_jobserver @job_name = 'UnlockUsers', @server_name = N'(local)'
----------------------------СОЗДАЕМ ГРУППЫ ПОЛЬЗОВАТЕЛЕЙ-------------------------
go
USE forum
go
----------------------------------Администратор-----------------------------------
EXEC sp_addlogin 'administrator', '123456', 'forum'
EXEC sp_addrole 'admin_role'
EXEC sp_adduser 'administrator', 'Administrator', 'admin_role'
go
--права для роли admin_role--
GRANT ALL ON best_users TO admin_role
GRANT ALL ON black_list TO admin_role
GRANT ALL ON group_info TO admin_role
GRANT ALL ON message_info TO admin_role
GRANT ALL ON topic TO admin_role
GRANT ALL ON user_activity TO admin_role
GRANT ALL ON user_group TO admin_role
GRANT ALL ON user_info TO admin_role
GRANT ALL ON visitor_statistic TO admin_role
GRANT ALL ON votes TO admin_role
GRANT ALL ON rubric TO admin_role
GRANT ALL ON answers TO admin_role
GRANT ALL ON DayMessageStatistic TO admin_role
GRANT ALL ON HourMessageStatistic TO admin_role
GRANT ALL ON MonthMessageStatistic TO admin_role
GRANT ALL ON YearMessageStatistic TO admin_role
GRANT EXEC ON AddUser TO admin_role
GRANT EXEC ON DeleteUser TO admin_role
GRANT EXEC ON ShowPrivateInfo TO admin_role
GRANT EXEC ON ChangePrivateInfo TO admin_role
GRANT EXEC ON AddUserToBlackList TO admin_role
GRANT EXEC ON CreateGroup TO admin_role
GRANT EXEC ON BlockTimeStatistic TO admin_role
GRANT EXEC ON JoinGroup TO admin_role
GRANT EXEC ON CreateMessage TO admin_role
GRANT EXEC ON CreateTopic TO admin_role
GRANT EXEC ON CreateRubric TO admin_role
GRANT EXEC ON CreateVote TO admin_role
GRANT EXEC ON AddAnswer TO admin_role
GRANT EXEC ON VoteCast TO admin_role
GRANT EXEC ON AddUserToBlackList TO admin_role
GRANT EXEC ON UsersNumberInPeriod TO admin_role
GRANT EXEC ON MessagesNumber TO admin_role
GRANT EXEC ON MessagesNumberStatistic TO admin_role
GRANT EXEC ON UpdateUserStatistic TO admin_role
GRANT EXEC ON DeleteTopics TO admin_role
GRANT EXEC ON UnlockUsers TO admin_role
GRANT EXEC ON UserVisitNumber TO admin_role
GRANT EXEC ON BlockTimeStatistic TO admin_role
GRANT EXEC ON VoteStatistic TO admin_role
GRANT EXEC ON BlockUsersStatistic TO admin_role
GRANT EXEC ON DeleteMessage TO admin_role
go
----------------------------------Пользователь-----------------------------------
EXEC sp_addrole 'user_role'
go
--права для роли user_role--
GRANT EXEC ON ShowPrivateInfo TO user_role
GRANT EXEC ON ChangePrivateInfo TO user_role
GRANT EXEC ON CreateGroup TO user_role
GRANT EXEC ON JoinGroup TO user_role
GRANT EXEC ON CreateMessage TO user_role
GRANT EXEC ON CreateTopic TO user_role
GRANT EXEC ON CreateRubric TO user_role
GRANT EXEC ON CreateVote TO user_role
GRANT EXEC ON AddAnswer TO user_role
GRANT EXEC ON VoteCast TO user_role
GRANT EXEC ON LeaveGroup TO user_role
GRANT EXEC ON DeleteMessageFromOwnTopic TO user_role
GRANT SELECT ON rubric TO user_role
GRANT SELECT ON topic TO user_role
GRANT SELECT ON message_info TO user_role
GRANT SELECT ON group_info TO user_role
GRANT SELECT ON votes TO user_role
GRANT SELECT ON answers TO user_role
GRANT SELECT ON best_users TO user_role
go
----------------------------------Модератор-----------------------------------
EXEC sp_addrole 'moderator_role'
go
--права для роли moderator_role--
GRANT EXEC ON AddUserToBlackList TO moderator_role
GRANT EXEC ON DeleteMessage TO moderator_role