\documentclass[a4paper, final]{article} %\usepackage{literat} % Нормальные шрифты \usepackage[14pt]{extsizes} % для того чтобы задать нестандартный 14-ый размер шрифта \usepackage{tabularx} \usepackage[T2A]{fontenc} \usepackage[utf8]{inputenc} \usepackage[russian]{babel} \usepackage{amsmath} \usepackage[left=25mm, top=20mm, right=20mm, bottom=20mm, footskip=10mm]{geometry} \usepackage{ragged2e} %для растягивания по ширине \usepackage{setspace} %для межстрочного интервала \usepackage{moreverb} %для работы с листингами \usepackage{indentfirst} % для абзацного отступа \usepackage{moreverb} %для печати в листинге исходного кода программ \usepackage{pdfpages} %для вставки других pdf файлов \usepackage{tikz} \usepackage{graphicx} \usepackage{afterpage} \usepackage{longtable} \usepackage{float} % \usepackage[paper=A4,DIV=12]{typearea} \usepackage{pdflscape} % \usepackage{lscape} \usepackage{array} \usepackage{multirow} \renewcommand\verbatimtabsize{4\relax} \renewcommand\listingoffset{0.2em} %отступ от номеров строк в листинге \renewcommand{\arraystretch}{1.4} % изменяю высоту строки в таблице \usepackage[font=small, singlelinecheck=false, justification=centering, format=plain, labelsep=period]{caption} %для настройки заголовка таблицы \usepackage{listings} %листинги \usepackage{xcolor} % цвета \usepackage{hyperref}% для гиперссылок \usepackage{enumitem} %для перечислений \newcommand{\specialcell}[2][l]{% \begin{tabular}[#1]{@{}l@{}}#2\end{tabular}} \setlist[enumerate,itemize]{leftmargin=1.2cm} %отступ в перечислениях \hypersetup{colorlinks, allcolors=[RGB]{010 090 200}} %красивые гиперссылки (не красные) % подгружаемые языки — подробнее в документации listings (это всё для листингов) \lstloadlanguages{ SQL} % включаем кириллицу и добавляем кое−какие опции \lstset{tabsize=2, breaklines, basicstyle=\footnotesize, columns=fullflexible, flexiblecolumns, numbers=left, numberstyle={\footnotesize}, keywordstyle=\color{blue}, inputencoding=cp1251, extendedchars=true } \lstdefinelanguage{MyC}{ language=SQL, % ndkeywordstyle=\color{darkgray}\bfseries, % identifierstyle=\color{black}, % morecomment=[n]{/**}{*/}, % commentstyle=\color{blue}\ttfamily, % stringstyle=\color{red}\ttfamily, % morestring=[b]", % showstringspaces=false, % morecomment=[l][\color{gray}]{//}, keepspaces=true, escapechar=\%, texcl=true } \textheight=24cm % высота текста \textwidth=16cm % ширина текста \oddsidemargin=0pt % отступ от левого края \topmargin=-1.5cm % отступ от верхнего края \parindent=24pt % абзацный отступ \parskip=5pt % интервал между абзацами \tolerance=2000 % терпимость к "жидким" строкам \flushbottom % выравнивание высоты страниц % Настройка листингов \lstset{ language=SQL, extendedchars=\true, inputencoding=utf8, keepspaces=true, % captionpos=b, } \begin{document} % начало документа % НАЧАЛО ТИТУЛЬНОГО ЛИСТА \begin{center} \hfill \break \hfill \break \normalsize{МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ\\ федеральное государственное автономное образовательное учреждение высшего образования «Санкт-Петербургский политехнический университет Петра Великого»\\[10pt]} \normalsize{Институт компьютерных наук и кибербезопасности}\\[10pt] \normalsize{Высшая школа технологий искусственного интеллекта}\\[10pt] \normalsize{Направление: 02.03.01 <<Математика и компьютерные науки>>}\\ \hfill \break \hfill \break \hfill \break \hfill \break \large{Отчет по лабораторным работам}\\ \large{<<Теоретические основы баз данных>>}\\ \hfill \break % \hfill \break \hfill \break \end{center} \small{ \begin{tabular}{lrrl} \!\!\!Студент, & \hspace{2cm} & & \\ \!\!\!группы 5130201/20102 & \hspace{2cm} & \underline{\hspace{3cm}} &Тищенко А. А. \\\\ \!\!\!Преподаватель & \hspace{2cm} & \underline{\hspace{3cm}} & Попов С. Г. \\\\ &&\hspace{4cm} \end{tabular} \begin{flushright} <<\underline{\hspace{1cm}}>>\underline{\hspace{2.5cm}} 2024г. \end{flushright} } \hfill \break % \hfill \break \begin{center} \small{Санкт-Петербург, 2024} \end{center} \thispagestyle{empty} % выключаем отображение номера для этой страницы % КОНЕЦ ТИТУЛЬНОГО ЛИСТА \newpage \tableofcontents \newpage \section*{Введение} \addcontentsline{toc}{section}{Введение} В данном отчёте описан результат выполнения лабораторных работ, расширяющих функциональные возможности базы данных для проведения соревнований по стрельбе из лука, которая была разработана в течение предыдущего семестрового курса «Теоретические основы баз данных». В ходе выполнения лабораторных работ изучены и реализованы в СУБД: представление, событийная модель (триггеры), права доступа, процедуры, функции и транзакции. \newpage \section {Постановка задачи} В ходе прохождения данного курса необходимо выполнить пять лабораторных работ. \begin{enumerate} \item Создать представление, инкапсулирующее запрос. Написать запрос, использующий в себе представление. \item Написать триггеры, автоматизирующие сбор статистической информации о количестве соревнований, в которых участвовал каждый судья. \item Создать двух пользователей. Первый должен иметь доступ только на просмотр представления из первого задания. Второй также должен уметь редактировать таблицы, участвующие в запросе представления. \end{enumerate} \newpage \section {Лабораторные работы} \subsection{Работа 1: Создание представлений} \textbf{Задача:} Разработать представление для хранения запроса внутри СУБД. \textbf{Формулировка задачи:} Посчитать для каждого спортсмена число заявок и число серий. Представление выдает только идентификатор спортсмена, число его заявок на соревнования и число серий выстрелов. Использовать представление в другом запросе. Сделано представление sportsman\_requests\_series\_count, которое хранит запрос, выполняющий поставленную задачу. В представлении участвуют таблицы \texttt{sportsman}, \texttt{participant\_request} и \texttt{shot\_series}. Код запроса для создания представления представлен в листинге~\ref{lst:view1}. \begin{figure}[h] \centering \includegraphics[width=0.4\linewidth]{img/view_result.png} \caption{Первые десять записей в представлении \texttt{sportsman\_requests\_series\_count}.} \label{fig:view} \end{figure} \begin{lstlisting}[mathescape=true, language=SQL, caption={Запрос для создания представления \texttt{sportsman\_requests\_series\_count}.}, label={lst:view1}] create view sportsman_requests_series_count as select s.id_sportsman, count(distinct pr.id_participant_request) as pr_count, count(ss.id_shot_series) as ss_count from sportsman as s left join participant_request as pr on s.id_sportsman = pr.id_sportsman left join shot_series as ss on pr.id_participant_request = ss.id_participant_request group by s.id_sportsman; \end{lstlisting} Получившееся представление представлено на Рис.~\ref{fig:view}. Также был составлен пример запроса, в котором используется представление \texttt{sportsman\_requests\_series\_count}, его код представлен в листинге~\ref{lst:view2}. В этом запросе выбираются 10 самых активных с точки зрения участия в соревнованиях спортсменов из клуба <<ЛК Парадокс Лучника>>. К исходному представлению также добавляются дополнительные столбцы с данными спортсмена из таблицы \texttt{sportsman}. Результат выполнения этого запроса представлен на Рис.~\ref{fig:view_query}. \begin{lstlisting}[mathescape=true, language=SQL, caption={Код примера запроса, в котором используется представление \texttt{sportsman\_requests\_series\_count}.}, label={lst:view2}] select srsc.id_sportsman, s.name, s.category, srsc.pr_count, srsc.ss_count from sportsman_requests_series_count as srsc join sportsman as s on srsc.id_sportsman = s.id_sportsman where s.gender = 'Мужчина' and s.club = 'ЛК Парадокс Лучника' order by srsc.pr_count desc limit 10; \end{lstlisting} \begin{figure}[h] \centering \includegraphics[width=1\linewidth]{img/view_query.png} \caption{Первые десять записей результата выполнения запроса с участием представления \texttt{sportsman\_requests\_series\_count}.} \label{fig:view_query} \end{figure} Созданное представление нельзя обновлять напрямую, а попытки его обновить приведут к ошибке, которая демонстрируется на Рис.~\ref{fig:insert_error}. Изменить данные представления можно только изменив исходные таблицы, которые в нём участвуют. \begin{figure}[h] \centering \includegraphics[width=1\linewidth]{img/insert_error.png} \caption{Результат попытки изменения данных напрямую через представление \texttt{sportsman\_requests\_series\_count}.} \label{fig:insert_error} \end{figure} \end{document}