Загрузка данных


-- Таблица «Импортеры»
CREATE TABLE importers (
    importer_id   SERIAL PRIMARY KEY,
    firm_name     VARCHAR(100) NOT NULL,
    country       VARCHAR(100) NOT NULL,
    product_code  VARCHAR(20) UNIQUE NOT NULL,
    product_name  VARCHAR(100) NOT NULL
);

-- Таблица «Поставка»
CREATE TABLE supplies (
    supply_id     SERIAL PRIMARY KEY,
    product_code  VARCHAR(20) NOT NULL REFERENCES importers(product_code),
    volume        INTEGER NOT NULL CHECK (volume > 0),
    unit_price    NUMERIC(10,2) NOT NULL CHECK (unit_price >= 0)
);

-- Таблица «Учет»
CREATE TABLE accounting (
    record_id      SERIAL PRIMARY KEY,
    supply_id      INTEGER NOT NULL REFERENCES supplies(supply_id),
    delivery_date  DATE NOT NULL,
    receipt_date   DATE,
    confirmation   BOOLEAN DEFAULT FALSE
);
INSERT INTO importers (firm_name, country, product_code, product_name) VALUES
('ООО Альфа',  'Германия', 'A001', 'Станок'),
('ООО Бета',   'Китай',    'B002', 'Телефон'),
('ООО Гамма',  'Германия', 'C003', 'Ноутбук'),
('ООО Дельта', 'США',      'D004', 'Планшет');

INSERT INTO supplies (product_code, volume, unit_price) VALUES
('A001', 10, 1500.00),
('A001',  5, 1450.00),
('B002', 100, 200.00),
('C003', 20, 800.00),
('D004', 30, 500.00);

INSERT INTO accounting (supply_id, delivery_date, receipt_date, confirmation) VALUES
(1, '2024-01-10', '2024-01-15', TRUE),
(2, '2024-02-01', '2024-02-05', TRUE),
(3, '2024-02-10', '2024-02-20', FALSE),
(4, '2024-03-01', '2024-03-10', TRUE),
(5, '2024-03-15', NULL, FALSE);
4. Запросы по индивидуальному заданию
4.1. Суммарный объем товаров, импортированных заданной страной
(пример для Германии)

sql
SELECT SUM(s.volume) AS total_volume
FROM importers i
JOIN supplies s ON i.product_code = s.product_code
WHERE i.country = 'Германия';
4.2. Суммарная стоимость партии товара по заданному шифру
(пример для шифра A001)

sql
SELECT SUM(s.volume * s.unit_price) AS total_cost
FROM supplies s
WHERE s.product_code = 'A001';
4.3. Минимальная стоимость товара
(минимальная цена за единицу)

sql
SELECT MIN(s.unit_price) AS min_unit_price
FROM supplies s;
4.4. Создать таблицу со стоимостью товаров, импортированных заданной страной
Таблица должна содержать наименование товара и суммарную стоимость партии.

sql
CREATE TABLE country_product_costs AS
SELECT i.product_name,
       SUM(s.volume * s.unit_price) AS total_cost
FROM importers i
JOIN supplies s ON i.product_code = s.product_code
WHERE i.country = 'Германия'
GROUP BY i.product_name;

-- Проверка
SELECT * FROM country_product_costs;
5. Создание пользователей и настройка прав
sql
-- Создание ролей с возможностью входа
CREATE ROLE user1 WITH LOGIN PASSWORD 'user1pass';
CREATE ROLE user2 WITH LOGIN PASSWORD 'user2pass';

-- Разрешение подключения к базе
GRANT CONNECT ON DATABASE variant11 TO user1, user2;

-- Разрешение использования схемы public
GRANT USAGE ON SCHEMA public TO user1, user2;

-- user1: чтение и запись
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO user1;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT USAGE, SELECT ON SEQUENCES TO user1;

-- user2: только чтение
GRANT SELECT ON ALL TABLES IN SCHEMA public TO user2;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT SELECT ON TABLES TO user2;
6. Проверка прав доступа
От имени user1 (в pgAdmin создайте новое подключение с логином user1 и паролем user1pass):

sql
-- Должно работать
INSERT INTO importers (firm_name, country, product_code, product_name)
VALUES ('Тест', 'Тест', 'T001', 'Тест');

SELECT * FROM importers;
От имени user2 (подключение с логином user2 и паролем user2pass):

sql
-- Должно работать
SELECT * FROM importers;

-- Должно выдать ошибку прав
INSERT INTO importers (firm_name, country, product_code, product_name)
VALUES ('Тест2', 'Тест2', 'T002', 'Тест2');
7. Резервное копирование и восстановление (через cmd)
Откройте cmd и перейдите в папку bin PostgreSQL:

cmd
cd "C:\Program Files\PostgreSQL\16\bin"
Замените 16 на вашу версию PostgreSQL.

7.1. Создание резервной копии
cmd
pg_dump -U postgres -h localhost -p 5432 -F c -b -v -f "C:\backup\variant11.backup" variant11
Если потребуется пароль — введите его.

7.2. Восстановление под другим именем
Сначала создайте новую базу:

cmd
createdb -U postgres -h localhost -p 5432 variant11_restored
Затем восстановите в неё резервную копию:

cmd
pg_restore -U postgres -h localhost -p 5432 -d variant11_restored -v "C:\backup\variant11.backup"
8. Что должно получиться в итоге
База variant11 с тремя связанными таблицами: importers, supplies, accounting.

Выполнены 4 запроса по варианту №11.

Создана таблица country_product_costs.

Созданы пользователи user1 (чтение/запись) и user2 (только чтение).

Сделана резервная копия и восстановлена база variant11_restored.

Если при создании роли postgres возникала ошибка role "postgres" does not exist, сначала выполните под своим системным пользователем:

sql
CREATE ROLE postgres WITH LOGIN SUPERUSER PASSWORD 'postgres';