Advertisement
Guest User

Untitled

a guest
Dec 26th, 2017
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement