Загрузка данных
-- Таблица «Импортеры»
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';