#set text(size: 1.3em)
#show link: underline
#set page(footer: context {
  if counter(page).get().first() > 1 [
    #align(center)[
      #counter(page).display("1")
    ]
  ]
})


#show raw.where(block: false): box.with(
  fill: luma(240),
  inset: (x: 3pt, y: 0pt),
  outset: (y: 3pt),
  radius: 2pt,
)

#show raw.where(block: true): block.with(
  fill: luma(240),
  inset: 10pt,
  radius: 4pt,
)
    
// title
    
#align(center)[Санкт-Петербургский национальный исследовательский университет информационных технологий, механики и оптики]
\
\
\
#align(center)[Факультет инфокоммуникационных технологий]
#align(center)[Направление подготовки 11.03.02]
\
\
#align(center)[Практическая работа №1.1]
#align(center)[Установка и первоначальная настройка субд postgresql.]
\
\
\ //#align(center)[Вариант 19]
\
\
\
\
\
\
\
#align(right)[Выполнил:]
#align(right)[Дощенников Никита Андреевич]
#align(right)[Группа: К3221]
#align(right)[Проверила:]
#align(right)[Татьяна Евгеньевна Войтюк]
\
\
#align(center)[Санкт-Петербург]
#align(center)[2025]

#pagebreak()
    
=== Цель работы: 

Освоить базовые приёмы установки и настройки субд "postgresql", научиться использовать pgadmin для администрирования, развернуть учебную базу данных "demo" и ознакомиться с её структурой, а также закрепить навыки создания баз данных и схем на примере учебной бд "hr".

=== Задачи, решаемые при выполнении работы.

- Установить и настроить субд postgresql и клиент pgadmin.
- Проверить правильность работы сервера с помощью выполнения тестового запроса.
- Развернуть учебную базу demo и убедиться в доступности её объектов.
- Ознакомиться со структурой базы demo и проанализировать основные сущности.
- Создать учебную базу данных двумя способами: через графический интерфейс и с помощью `CREATE DATABASE`.
- Создать в базе данных hr схемы для группировки объектов.

=== Исходные данные.

- Сервер с установленными docker и контейнерами:
  - postgres:16 — сервер субд postgresql,
  - dpage/pgadmin4 — веб-интерфейс для администрирования.
- Учебная база данных demo.

=== Выполнение работы.

==== Задание 1. Установка необходимого ПО.

Для выполнения работы была установлена субд postgresql и приложение pgadmin. Установка производилась в среде docker. 

На сервере был установлен docker и запущены контейнеры: `postgres:16`, `dpage/pgadmin4`.

#align(center)[#image("assets/18.png")]

Контейнеры были объединены в общую сеть docker, чтобы pgadmin мог напрямую подключаться к postgres. 

#align(center)[#image("assets/19.png")]

pgadmin стал доступен по адресу #link("https://db.fymio.us")[db.fymio.us]

#align(center)[#image("assets/20.png")] 

В pgadmin был зарегистрирован новый сервер. В настройках подключения были указаны следующие параметры: 

#align(center)[#image("assets/16.png")]
#align(center)[#image("assets/17.png")]

В "Object Explorer" слева я раскрыл узел "Databases":

#align(center)[#image("assets/1.png")]

Затем я нажал ПКМ по базе "postgres" и выбрал инструмент "Querry Tool":

#align(center)[#image("assets/2.png")]

В открывшемся окне написал запрос проверки версии сервера `SELECT version();`. После этого нажал кнопку "Execute script". 

#align(center)[#image("assets/3.png")]

В поле "Data Output" я увидел версию `PostgreSQL 16.10`.


==== Задание 2. Подключение учебной базы данных.

После выполнения следующих команд на сервере учебная база данных появилась в "Object Explorer".

```bash
wget https://edu.postgrespro.ru/demo-medium.zip
unzip demo-medium.zip
docker exec -i postgres psql -U postgres -d postgres < demo-medium-20170815.sql
```

После появления базы данных "demo", в "Querry Tool" я выполнил следующий скрипт: 

```sql
SELECT * FROM bookings.aircrafts_data;
```

#align(center)[#image("assets/4.png")]

==== Задание 3. Ознакомление с учебной БД.

Я ознакомился с описанием БД на сайте #link("https://postgrespro.ru/education/demodb")[postgrespro.ru/education/demodb]

==== Задание 4. Создание учебной базы данных HR средствами pgAdmin. 

Я нажал ПКМ на узле "Databases" и выбрал меню "Create" затем "Database...".

#align(center)[#image("assets/5.png")]

Затем в октрывшемся окне я выставил следующие настройки.

#align(center)[#image("assets/6.png")]
#align(center)[#image("assets/7.png")]

Затем я сохранил настройки. В "Object Explorer" появилась созданная база.

#align(center)[#image("assets/8.png")]

После этого я удалил базу через ПКМ.

#align(center)[#image("assets/9.png")]

==== Задание 5. Создание учебной базы данных HR средствами PL/pgSQL

Я открыл "Querry Tool" базы данных `postgres`. И прописал следующий скрипт.

```sql
CREATE DATABASE hr
  WITH ENCODING 'UTF8'
       LC_COLLATE 'C'
       LC_CTYPE 'C'
       TEMPLATE template0
       CONNECTION LIMIT 1;
```

#align(center)[#image("assets/10.png")]

После этого в списке баз появилась созданная.

#align(center)[#image("assets/11.png")]

==== Задание 6. Создание схем.

Я развернул вкладку для создания схем. 

#align(center)[#image("assets/12.png")]

И создал схему "EmployeesDepartments". В "Object Explorer" видно что схема создана.

#align(center)[#image("assets/13.png")]

Чтобы создать вторую схему, я открыл "Querry Tool" к базе `hr`. И прописал следующие запросы: 

```cs
CREATE SCHEMA IF NOT EXISTS "countries"
AUTHORIZATION postgres;
```

#align(center)[#image("assets/14.png")]

В "Object Explorer" видна добавленная схема: 

#align(center)[#image("assets/15.png")]

=== Выводы. 

В ходе выполнения работы я освоил базовые приёмы установки и настройки субд postgresql, а также работу с клиентским приложением pgadmin. Было развернуто необходимое программное обеспечение в контейнерах Docker.

В процессе работы удалось установить postgresql и pgadmin, загрузить и подключить учебную базу данных и выполнить тестовые запросы к ней, ознакомиться со структурой demo и основными сущностями, создать учебную базу данных двумя способами, через графический интерфейс pgadmin и с использованием `CREATE DATABASE`, создать в базе две схемы: одну средствами pgadmin, вторую — с помощью sql-запроса.

При выполнении работы возникли следующие трудности: при создании базы данных через SQL возникала ошибка с параметрами локали. Она была устранена с помощью указания `TEMPLATE template0` и нейтральной локали `C`. При подключении pgadmin к серверу пришлось настраивать отдельную docker-сеть и регистрировать контейнеры, чтобы обеспечить доступность сервиса по адресу #link("https://db.fymio.us")[`db.fymio.us`].

