Advertisement
Guest User

SQL sqript

a guest
May 12th, 2019
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 20.86 KB | None | 0 0
  1.  
  2. CREATE schema movies
  3.  
  4. CREATE TABLE movies.people (
  5.   first_name VARCHAR(255)   NOT NULL,
  6.   last_name VARCHAR(255)   NOT NULL,
  7.   birth_date DATE,
  8.   country VARCHAR(255),
  9.   city VARCHAR(255),
  10.  
  11.  
  12.   CONSTRAINT pk_people PRIMARY KEY(first_name, last_name),
  13.   CONSTRAINT correct_birth_date CHECK (birth_date > '1900-01-01' AND birth_date < now()::DATE)
  14.  );
  15.  
  16. CREATE TABLE movies.users (
  17.   username VARCHAR(255)   NOT NULL,
  18.   email VARCHAR(255)    NOT NULL,
  19.   reg_date DATE   NOT NULL DEFAULT now()::DATE,
  20.   country VARCHAR(255),
  21.   first_name VARCHAR(255),
  22.   last_name VARCHAR(255),
  23.  
  24.   CONSTRAINT pk_users PRIMARY KEY (username),
  25.   CONSTRAINT correct_email CHECK (email LIKE '__%@_%._%')
  26. );
  27.  
  28. CREATE TABLE movies.movie (
  29.   id serial  NOT NULL ,
  30.   name VARCHAR(255)   NOT NULL,
  31.   p_year INTEGER,
  32.   country VARCHAR(255),
  33.   genre VARCHAR(255),
  34.   budget INTEGER,
  35.  
  36.   CONSTRAINT pk_movie PRIMARY KEY(id),
  37.   CONSTRAINT correct_year CHECK (p_year > 1800),
  38.   CONSTRAINT positive_budget CHECK ( budget > 0 )
  39. );
  40.  
  41. CREATE TABLE movies.showtimes (
  42.   id serial  NOT NULL,
  43.   movie_id INTEGER   NOT NULL,
  44.   DATE DATE,
  45.   TIME TIME,
  46.   country VARCHAR(255),
  47.   city VARCHAR(255),
  48.   theater VARCHAR(255),
  49.   income INTEGER,
  50.  
  51.   CONSTRAINT pk_showtimes PRIMARY KEY(id),
  52.   CONSTRAINT fk_movie FOREIGN KEY(movie_id) REFERENCES movies.movie(id)
  53. );
  54.  
  55. CREATE INDEX showtimes_fk_movies ON movies.showtimes (movie_id);
  56.  
  57. CREATE TABLE movies.users_has_showtimes (
  58.   users_username VARCHAR(255) NOT NULL,
  59.   showtimes_id INTEGER NOT NULL,
  60.  
  61.   CONSTRAINT pk_uhs PRIMARY KEY(users_username, showtimes_id),
  62.   CONSTRAINT fk_users FOREIGN KEY(users_username) REFERENCES movies.users(username),
  63.   CONSTRAINT fk_showtimes FOREIGN KEY(showtimes_id) REFERENCES movies.showtimes(id)
  64. );
  65.  
  66.  
  67. CREATE INDEX users_has_showtimes_fk_users ON movies.users_has_showtimes (users_username);
  68. CREATE INDEX users_has_showtimes_fk_showtimes ON movies.users_has_showtimes (showtimes_id);
  69.  
  70. CREATE TABLE movies.grades (
  71.   id serial  NOT NULL,
  72.   movie_id INTEGER   NOT NULL,
  73.   users_username VARCHAR(255)   NOT NULL,
  74.   grade INTEGER,
  75.   recommend bool,
  76.   review text,
  77.  
  78.   CONSTRAINT pk_grades PRIMARY KEY(id),
  79.   CONSTRAINT fk_movie FOREIGN KEY(movie_id) REFERENCES movies.movie(id),
  80.   CONSTRAINT fk_users FOREIGN KEY(users_username) REFERENCES movies.users(username),
  81.   CONSTRAINT correct_grade CHECK (grade > 0 AND grade <= 10)
  82. );
  83.  
  84. CREATE INDEX grades_fk_index_movie ON movies.grades (movie_id);
  85. CREATE INDEX grades_fk_index_users ON movies.grades (users_username);
  86.  
  87. CREATE TABLE movies.movie_has_people (
  88.   people_last_name VARCHAR(255)   NOT NULL,
  89.   people_first_name VARCHAR(255)   NOT NULL,
  90.   movie_id INTEGER   NOT NULL,
  91.   job VARCHAR(255)   NOT NULL,
  92.   salary INTEGER   NOT NULL,
  93.   CONSTRAINT positive_salary CHECK (salary > 0),
  94.  
  95.   CONSTRAINT pk_movie_has_people PRIMARY KEY(people_last_name, people_first_name, job, movie_id),
  96.   CONSTRAINT fk_movie FOREIGN KEY(movie_id) REFERENCES movies.movie(id),
  97.   CONSTRAINT fk_people FOREIGN KEY(people_first_name, people_last_name)
  98.     REFERENCES movies.people(first_name, last_name)
  99. );
  100.  
  101.  
  102. CREATE INDEX movie_has_people_fk_movies ON movies.movie_has_people (movie_id);
  103. CREATE INDEX movie_has_people_fk_people ON movies.movie_has_people (people_first_name, people_last_name);
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112. INSERT INTO movies.people VALUES (
  113.       'Андрей', 'Тарковский', '04-04-1932', 'СССР', 'Завражье'
  114. );
  115. INSERT INTO movies.people VALUES (
  116.       'Квентин', 'Тарантино', '27-03-1963', 'США', 'Ноксвилл'
  117. );
  118. INSERT INTO movies.people VALUES (
  119.       'Леонардо', 'ДиКаприо', '11-11-1974', 'США', 'Лос-Анджелес'
  120. );
  121. INSERT INTO movies.people VALUES (
  122.       'Том', 'Хэнкс', '09-07-1956', 'США', 'Конкорд'
  123. );
  124. INSERT INTO movies.people VALUES (
  125.       'Юрий', 'Быков', '15-08-1981', 'СССР', 'Новомичуринск'
  126. );
  127. INSERT INTO movies.people VALUES (
  128.       'Майкл', 'Бей', '17-03-1965', 'США', 'Лос-Анджелес'
  129. );
  130. INSERT INTO movies.people VALUES (
  131.       'Райан', 'Гостлинг', '12-11-1980', 'Канада', 'Лондон'
  132. );
  133. INSERT INTO movies.people VALUES (
  134.       'Никита', 'Михалков', '21-10-1945', 'СССР', 'Москва'
  135. );
  136. INSERT INTO movies.people VALUES (
  137.       'Гай', 'Ричи', '10-09-1968', 'Великобритания', 'Хатфилд'
  138. );
  139. INSERT INTO movies.people VALUES (
  140.       'Кристофер', 'Нолан', '30-07-1970', 'Великобритания', 'Лондон'
  141. );
  142.  
  143.  
  144.  
  145.  
  146.  
  147.  
  148.  
  149.  
  150. INSERT INTO movies.users (username, email) VALUES (
  151.       'YYY_NaGiBaToR_YYY', 'vanya2006@mail.ru'
  152. );
  153. INSERT INTO movies.users (username, email) VALUES (
  154.       'Qunantiah', 'qunant@gmail.com'
  155. );
  156. INSERT INTO movies.users (username, email) VALUES (
  157.       'Gumanari', 'slavavv@mail.ru'
  158. );
  159. INSERT INTO movies.users (username, email) VALUES (
  160.       'Geveve', 'izmair@yahoo.com'
  161. );
  162. INSERT INTO movies.users (username, email) VALUES (
  163.       'AnImE_PsIh', 'kolya2008@mail.ru'
  164. );
  165. INSERT INTO movies.users (username, email, reg_date, first_name) VALUES (
  166.       'MishMish', 'mhavarov@mail.ru', '21-04-2008', 'Миша'
  167. );
  168. INSERT INTO movies.users (username, email, reg_date, first_name, last_name, country) VALUES (
  169.       'EVGENII_NIKOVLAEVICH_PONASENKOV', 'greatest_genious@mail.ru', '11-01-2005', 'Евгений', 'Понасенков', 'Россия'
  170. );
  171.  
  172.  
  173.  
  174. INSERT INTO movies.movie (name, p_year, country, genre, budget) VALUES (
  175.        'Трансформеры', 2009, 'США', 'Экшн', 250000000
  176. );
  177. INSERT INTO movies.movie (name, p_year, country, genre, budget) VALUES (
  178.        'Белое солнце пустыни 2', 2007, 'Россия', 'Экшн', 5000000
  179. );
  180. INSERT INTO movies.movie (name, p_year, country, genre, budget) VALUES (
  181.        'Криминальное чтиво', 1990, 'США', 'Экшн', 50000000
  182. );
  183. INSERT INTO movies.movie (name, p_year, country, genre, budget) VALUES (
  184.        'Волк с Уолл-Стрит', 2005, 'США', 'Драма', 100000000
  185. );
  186. INSERT INTO movies.movie (name, p_year, country, genre, budget) VALUES (
  187.        'Карты, деньги, два ствола', 1999, 'Великобритания', 'Экшн', 3000000
  188. );
  189. INSERT INTO movies.movie (name, p_year, country, genre, budget) VALUES (
  190.        'Драйв', 2007, 'США', 'Экшн', 90000000
  191. );
  192. INSERT INTO movies.movie (name, p_year, country, genre) VALUES (
  193.        'Солярис', 1956, 'СССР', 'Фантастика'
  194. );
  195. INSERT INTO movies.movie (name, p_year, country, genre, budget) VALUES (
  196.        'Завод', 2018, 'Россия', 'Драмма', 4000000
  197. );
  198. INSERT INTO movies.movie (name, p_year, country, genre, budget) VALUES (
  199.        'Зеленая миля', 1997, 'США', 'Драма', 200000000
  200. );
  201. INSERT INTO movies.movie (name, p_year, country, genre, budget) VALUES (
  202.        'Твое имя', 2016, 'Япония', 'Аниме', 150000000
  203. );
  204.  
  205.  
  206.  
  207.  
  208.  
  209.  
  210.  
  211. INSERT INTO movies.showtimes (movie_id, DATE, TIME, country, city, theater) VALUES (
  212.       10, '12-12-2018', '18:00', 'Россия', 'Москва', 'Октябрьский'
  213. );
  214.  
  215. INSERT INTO movies.showtimes (movie_id, DATE, TIME, country, city, theater) VALUES (
  216.       10, '13-12-2018', '15:00', 'Россия', 'Москва', 'Октябрьский'
  217. );
  218.  
  219. INSERT INTO movies.showtimes (movie_id, DATE, TIME, country, city, theater) VALUES (
  220.       10, '14-12-2018', '12:00', 'Россия', 'Москва', 'Октябрьский'
  221. );
  222.  
  223. INSERT INTO movies.showtimes (movie_id, DATE, TIME, country, city, theater) VALUES (
  224.       10, '15-12-2018', '18:00', 'Россия', 'Москва', 'Октябрьский'
  225. );
  226.  
  227. INSERT INTO movies.showtimes (movie_id, DATE, TIME, country, city, theater) VALUES (
  228.       1, '12-12-2018', '15:00', 'Россия', 'Москва', '17D'
  229. );
  230.  
  231. INSERT INTO movies.showtimes (movie_id, DATE, TIME, country, city, theater) VALUES (
  232.       2, '12-12-2018', '18:00', 'Россия', 'Москва', 'Патриот'
  233. );
  234.  
  235. INSERT INTO movies.showtimes (movie_id, DATE, TIME, country, city, theater) VALUES (
  236.       3, '12-12-2018', '18:00', 'Россия', 'Москва', 'АртДом'
  237. );
  238.  
  239. INSERT INTO movies.showtimes (movie_id, DATE, TIME, country, city, theater) VALUES (
  240.       6, '15-12-2018', '18:00', 'Россия', 'Москва', 'Октябрьский'
  241. );
  242.  
  243. INSERT INTO movies.showtimes (movie_id, DATE, TIME, country, city, theater) VALUES (
  244.       7, '12-12-2018', '15:00', 'Россия', 'Москва', '17D'
  245. );
  246.  
  247. INSERT INTO movies.showtimes (movie_id, DATE, TIME, country, city, theater) VALUES (
  248.       8, '12-12-2018', '18:00', 'Россия', 'Москва', 'Патриот'
  249. );
  250.  
  251. INSERT INTO movies.showtimes (movie_id, DATE, TIME, country, city, theater) VALUES (
  252.       3, '12-12-2018', '18:00', 'Россия', 'Москва', 'АртДом'
  253. );
  254.  
  255.  
  256.  
  257. INSERT INTO movies.grades (movie_id, users_username, grade, recommend, review) VALUES (
  258.        1, 'EVGENII_NIKOVLAEVICH_PONASENKOV', 1, FALSE, 'Дешевка'
  259. );
  260. INSERT INTO movies.grades (movie_id, users_username, grade, recommend, review) VALUES (
  261.        2, 'EVGENII_NIKOVLAEVICH_PONASENKOV', 1, FALSE, 'Дешевка'
  262. );
  263. INSERT INTO movies.grades (movie_id, users_username, grade, recommend, review) VALUES (
  264.        3, 'EVGENII_NIKOVLAEVICH_PONASENKOV', 1, FALSE, 'Дешевка'
  265. );
  266. INSERT INTO movies.grades (movie_id, users_username, grade, recommend, review) VALUES (
  267.        4, 'EVGENII_NIKOVLAEVICH_PONASENKOV', 1, FALSE, 'Дешевка'
  268. );
  269. INSERT INTO movies.grades (movie_id, users_username, grade, recommend, review) VALUES (
  270.        5, 'EVGENII_NIKOVLAEVICH_PONASENKOV', 1, FALSE, 'Дешевка'
  271. );
  272. INSERT INTO movies.grades (movie_id, users_username, grade, recommend, review) VALUES (
  273.        6, 'EVGENII_NIKOVLAEVICH_PONASENKOV', 1, FALSE, 'Дешевка'
  274. );
  275. INSERT INTO movies.grades (movie_id, users_username, grade, recommend, review) VALUES (
  276.        7, 'EVGENII_NIKOVLAEVICH_PONASENKOV', 1, FALSE, 'Дешевка'
  277. );
  278. INSERT INTO movies.grades (movie_id, users_username, grade, recommend, review) VALUES (
  279.        8, 'EVGENII_NIKOVLAEVICH_PONASENKOV', 1, FALSE, 'Дешевка'
  280. );
  281. INSERT INTO movies.grades (movie_id, users_username, grade, recommend, review) VALUES (
  282.        9, 'EVGENII_NIKOVLAEVICH_PONASENKOV', 1, FALSE, 'Дешевка'
  283. );
  284. INSERT INTO movies.grades (movie_id, users_username, grade, recommend, review) VALUES (
  285.        10, 'EVGENII_NIKOVLAEVICH_PONASENKOV', 1, FALSE, 'Дешевка'
  286. );
  287. INSERT INTO movies.grades (movie_id, users_username, grade, recommend, review) VALUES (
  288.        10, 'AnImE_PsIh', 10, TRUE, 'Гениильно 10 из 10'
  289. );
  290. INSERT INTO movies.grades (movie_id, users_username, grade, recommend, review) VALUES (
  291.        1, 'YYY_NaGiBaToR_YYY', 10, TRUE, 'Ваще крута!!11 Смешные шутки))0 и классный экнш!!))'
  292. );
  293. INSERT INTO movies.grades (movie_id, users_username, grade, recommend) VALUES (
  294.        3, 'Gumanari', 5, FALSE
  295. );
  296. INSERT INTO movies.grades (movie_id, users_username, grade, recommend) VALUES (
  297.        7, 'Gumanari', 3, FALSE
  298. );
  299. INSERT INTO movies.grades (movie_id, users_username, grade, recommend) VALUES (
  300.        4, 'Geveve', 10, TRUE
  301. );
  302. INSERT INTO movies.grades (movie_id, users_username, grade, recommend) VALUES (
  303.        6, 'Geveve', 5, TRUE
  304. );
  305. INSERT INTO movies.grades (movie_id, users_username, grade, recommend) VALUES (
  306.        3, 'Geveve', 8, TRUE
  307. );
  308. INSERT INTO movies.grades (movie_id, users_username, grade, recommend) VALUES (
  309.        1, 'Qunantiah', 1, FALSE
  310. );
  311. INSERT INTO movies.grades (movie_id, users_username, grade, recommend) VALUES (
  312.        3, 'Qunantiah', 7, TRUE
  313. );
  314. INSERT INTO movies.grades (movie_id, users_username, grade, recommend) VALUES (
  315.        5, 'Qunantiah', 2, FALSE
  316. );
  317. INSERT INTO movies.grades (movie_id, users_username, grade, recommend) VALUES (
  318.        2, 'Qunantiah', 2, FALSE
  319. );
  320.  
  321.  
  322. INSERT INTO movies.movie_has_people (people_last_name, people_first_name, movie_id, job, salary) VALUES (
  323.         'Тарковский', 'Андрей', 7, 'Режиссер', 1000
  324. );
  325. INSERT INTO movies.movie_has_people (people_last_name, people_first_name, movie_id, job, salary) VALUES (
  326.         'Бей', 'Майкл', 1, 'Режиссер', 500000
  327. );
  328. INSERT INTO movies.movie_has_people (people_last_name, people_first_name, movie_id, job, salary) VALUES (
  329.         'Тарантино', 'Квентин', 3, 'Режиссер', 390000
  330. );
  331. INSERT INTO movies.movie_has_people (people_last_name, people_first_name, movie_id, job, salary) VALUES (
  332.        'Тарантино', 'Квентин', 3, 'Актер', 45000
  333. );
  334. INSERT INTO movies.movie_has_people (people_last_name, people_first_name, movie_id, job, salary) VALUES (
  335.        'Тарантино', 'Квентин', 3, 'Сценарист', 100000
  336. );
  337. INSERT INTO movies.movie_has_people (people_last_name, people_first_name, movie_id, job, salary) VALUES (
  338.         'Гостлинг', 'Райан', 6, 'Актер', 200000
  339. );
  340. INSERT INTO movies.movie_has_people (people_last_name, people_first_name, movie_id, job, salary) VALUES (
  341.         'Быков', 'Юрий', 8, 'Режиссер', 10000
  342. );
  343. INSERT INTO movies.movie_has_people (people_last_name, people_first_name, movie_id, job, salary) VALUES (
  344.         'Быков', 'Юрий', 8, 'Актер', 10000
  345. );
  346. INSERT INTO movies.movie_has_people (people_last_name, people_first_name, movie_id, job, salary) VALUES (
  347.         'Быков', 'Юрий', 8, 'Сценарист', 10000
  348. );
  349. INSERT INTO movies.movie_has_people (people_last_name, people_first_name, movie_id, job, salary) VALUES (
  350.         'Ричи', 'Гай', 5, 'Сценарист', 50000
  351. );
  352. INSERT INTO movies.movie_has_people (people_last_name, people_first_name, movie_id, job, salary) VALUES (
  353.         'Хэнкс', 'Том', 9, 'Актер', 250000
  354. );
  355. INSERT INTO movies.movie_has_people (people_last_name, people_first_name, movie_id, job, salary) VALUES (
  356.         'ДиКаприо', 'Леонардо', 4, 'Актер', 300000
  357. );
  358.  
  359.  
  360. INSERT INTO movies.users_has_showtimes (users_username, showtimes_id) VALUES (
  361.         'AnImE_PsIh', 1
  362. );
  363. INSERT INTO movies.users_has_showtimes (users_username, showtimes_id) VALUES (
  364.         'AnImE_PsIh', 2
  365. );
  366. INSERT INTO movies.users_has_showtimes (users_username, showtimes_id) VALUES (
  367.         'AnImE_PsIh', 3
  368. );
  369. INSERT INTO movies.users_has_showtimes (users_username, showtimes_id) VALUES (
  370.         'AnImE_PsIh', 4
  371. );
  372. INSERT INTO movies.users_has_showtimes (users_username, showtimes_id) VALUES (
  373.         'Qunantiah', 5
  374. );
  375. INSERT INTO movies.users_has_showtimes (users_username, showtimes_id) VALUES (
  376.         'Geveve', 6
  377. );
  378. INSERT INTO movies.users_has_showtimes (users_username, showtimes_id) VALUES (
  379.         'EVGENII_NIKOVLAEVICH_PONASENKOV', 7
  380. );
  381. INSERT INTO movies.users_has_showtimes (users_username, showtimes_id) VALUES (
  382.         'Gumanari', 8
  383. );
  384. INSERT INTO movies.users_has_showtimes (users_username, showtimes_id) VALUES (
  385.         'YYY_NaGiBaToR_YYY', 9
  386. );
  387. INSERT INTO movies.users_has_showtimes (users_username, showtimes_id) VALUES (
  388.         'MishMish', 10
  389. );
  390. INSERT INTO movies.users_has_showtimes (users_username, showtimes_id) VALUES (
  391.         'AnImE_PsIh', 11
  392. );
  393.  
  394.  
  395. ---- Выбирает самого высокооплачиваемого актера -----
  396. SELECT people_first_name AS "Имя", people_last_name AS "Фамилия"
  397.   FROM movies.movie_has_people
  398.     WHERE salary = (SELECT MAX(salary)
  399.       FROM movies.movie_has_people
  400.         WHERE job = 'Актер');
  401.  
  402. ---- Данные о пользователе который ставит самые низкие оценки ----
  403.  
  404. SELECT username AS "Никнейм", email AS "E-Mail", reg_date AS "Дата регистрации",
  405.        country AS "Страна", first_name AS "Имя", last_name AS  "Фамилия" FROM movies.users
  406.   WHERE username IN (WITH usr_avg AS (SELECT users_username, avg(grade) AS "avg_grd"
  407.     FROM movies.grades
  408.       GROUP BY users_username)
  409.         SELECT users_username FROM usr_avg
  410.           WHERE usr_avg.avg_grd = (SELECT MIN(avg_grd) FROM usr_avg));
  411.  
  412. ---- Фильм который пользователи чаще всего смотрели в кинотеатрах и количество просмотров ----
  413.  
  414. SELECT DISTINCT ON (users_username) users_username AS "Никнейм", name AS "Название" , COUNT(*) AS "Количество"
  415.   FROM movies.users_has_showtimes INNER JOIN movies.showtimes ON
  416.       movies.showtimes.id = movies.users_has_showtimes.showtimes_id INNER JOIN
  417.         movies.movie ON movies.movie.id = movie_id
  418.           GROUP BY users_username, name
  419.             ORDER BY users_username, "Количество" DESC;
  420.  
  421.  
  422.  
  423.  
  424.  
  425. ---- Имя фильма и его средний рейтинг -----
  426. CREATE VIEW movies.AverageRating AS
  427.   SELECT name, avg(grade)
  428.     FROM movies.movie INNER JOIN movies.grades ON
  429.       movies.movie.id = movie_id
  430.         GROUP BY movies.movie.id;
  431.  
  432. SELECT * FROM movies.AverageRating;
  433.  
  434.  
  435. ---- Информация о пользователях доступная всех ----
  436.  
  437. CREATE VIEW movies.UserInfo AS
  438.   SELECT username,
  439.     CASE
  440.       WHEN country IS NULL THEN 'undefined'
  441.       ELSE country END country,
  442.     CASE
  443.       WHEN last_name IS NULL THEN 'undefined'
  444.       ELSE last_name END last_name,
  445.     CASE
  446.       WHEN first_name IS NULL THEN 'undefined'
  447.       ELSE first_name END first_name
  448.     FROM movies.users;
  449.  
  450. SELECT * FROM movies.UserInfo;
  451.  
  452.  
  453. CREATE OR REPLACE FUNCTION movies.get_kinopoisk_rating(m_id INT) RETURNS FLOAT AS $$
  454. DECLARE
  455.     res FLOAT;
  456.     current_magic_constant FLOAT := 5;
  457.     average_rating FLOAT;
  458.     movie_average_rating FLOAT;
  459.     number_of_votes INT;
  460. BEGIN
  461.     average_rating = (SELECT avg(grade) FROM movies.grades);
  462.     movie_average_rating = (SELECT avg(grade) FROM movies.grades WHERE movie_id = m_id);
  463.     number_of_votes = (SELECT COUNT(grade) FROM movies.grades WHERE movie_id = m_id);
  464.     res = (number_of_votes::FLOAT / (number_of_votes::FLOAT + current_magic_constant)) * movie_average_rating +
  465.           (current_magic_constant::float4 / (number_of_votes::FLOAT + current_magic_constant)) * average_rating;
  466.     RETURN res;
  467. END
  468. $$ LANGUAGE 'plpgsql';
  469.  
  470.  
  471. SELECT movies.get_kinopoisk_rating(1);
  472.  
  473. CREATE OR REPLACE FUNCTION movies.closest_showtime(m_id INT) RETURNS DATE AS $$
  474. DECLARE
  475.     res DATE;
  476. BEGIN
  477.     RETURN (SELECT MIN(movies.showtimes.DATE)::DATE FROM movies.showtimes
  478.         WHERE movies.showtimes.DATE > now()::DATE AND movie_id = m_id);
  479. END
  480. $$ LANGUAGE 'plpgsql';
  481.  
  482.  
  483.  
  484.  
  485. CREATE OR REPLACE FUNCTION movies.add_person() RETURNS TRIGGER AS
  486.   $$
  487.   DECLARE
  488.     fn VARCHAR(255);
  489.     ln VARCHAR(255);
  490.     BEGIN
  491.     fn := NEW.people_first_name;
  492.     ln := NEW.people_last_name;
  493.       IF fn IS NULL
  494.         THEN raise exception 'not null';
  495.          END IF;
  496.  
  497.         IF ln IS NULL
  498.         THEN raise exception 'not null';
  499.          END IF;
  500.  
  501.          BEGIN
  502.             INSERT INTO movies.people (first_name, last_name) VALUES (fn, ln);
  503.          exception
  504.             WHEN others THEN
  505.            END;
  506.  
  507.          RETURN NEW;
  508.     END;
  509.   $$ LANGUAGE 'plpgsql';
  510.  
  511.  
  512. CREATE TRIGGER movie_has_ppl_insert
  513.   BEFORE INSERT ON movies.movie_has_people
  514.   FOR each ROW EXECUTE PROCEDURE movies.add_person();
  515.  
  516.  
  517. CREATE OR REPLACE FUNCTION movies.delete_user() RETURNS TRIGGER AS
  518.   $$
  519.   DECLARE
  520.     un VARCHAR(255);
  521.     BEGIN
  522.     un := OLD.username;
  523.  
  524.     DELETE FROM movies.grades WHERE users_username = un;
  525.     DELETE FROM movies.users_has_showtimes WHERE users_username = un;
  526.  
  527.     RETURN OLD;
  528.     END;
  529.   $$ LANGUAGE 'plpgsql';
  530.  
  531. CREATE TRIGGER delete_user_from_users
  532.   BEFORE DELETE ON movies.users
  533.   FOR each ROW EXECUTE PROCEDURE movies.delete_user();
  534.  
  535.  
  536.  
  537.   CREATE ROLE common_user;
  538. -- обычный пользователь, может просматривить оценки и публичную информаию других пользователей
  539.  
  540. GRANT SELECT ON movies.averagerating TO common_user;
  541. GRANT SELECT ON movies.userinfo TO common_user;
  542. GRANT INSERT ON movies.grades TO common_user;
  543.  
  544.  
  545.  
  546. CREATE ROLE moderator WITH password 'password';
  547. -- модератор, может просматривать любую информацию о пользователях, а также удалять отзывы
  548.  
  549. GRANT SELECT, DELETE ON movies.grades TO moderator;
  550. GRANT SELECT ON movies.users TO moderator;
  551.  
  552.  
  553. CREATE ROLE rkn;
  554. --РКН, может запрещать фильмы, удалять неугодные комментарии и банить оставивших их людей,
  555.   -- также имеет права на отмену любого сеанса, чтобы дать место отечественному кинематографу
  556. GRANT SELECT, DELETE, INSERT ON movies.showtimes TO rkn;
  557. GRANT DELETE ON movies.users TO rkn;
  558. GRANT DELETE ON movies.grades TO rkn;
  559. GRANT DELETE ON movies.movie TO rkn;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement