-- 1. Создание базы данных
CREATE DATABASE school_db;
\c school_db -- Подключение к созданной базе (для psql)
SET ROLE r_ФАМИЛИЯ;
-- 2. Создание роли r_ФАМИЛИЯ с паролем и доступом до конца года
CREATE ROLE r_ФАМИЛИЯ LOGIN PASSWORD 'securepassword' VALID UNTIL '2024-12-31';
GRANT CONNECT ON DATABASE school_db TO r_ФАМИЛИЯ;
GRANT USAGE ON SCHEMA public TO r_ФАМИЛИЯ;
-- 3. Создание таблицы "students"
CREATE TABLE students (
id SERIAL PRIMARY KEY,
фамилия VARCHAR(50) NOT NULL,
предмет VARCHAR(50) NOT NULL,
школа VARCHAR(50) NOT NULL,
баллы INT CHECK (баллы >= 0 AND баллы <= 100)
);
-- Назначение прав для r_ФАМИЛИЯ
GRANT SELECT, INSERT, UPDATE ON students TO r_ФАМИЛИЯ;
-- 4. Создание вложенной роли r1_ФАМИЛИЯ
CREATE ROLE r1_ФАМИЛИЯ;
GRANT r1_ФАМИЛИЯ TO r_ФАМИЛИЯ;
-- 5. Добавление колонки "год рождения"
ALTER TABLE students ADD COLUMN год_рождения INT CHECK (год_рождения > 1900);
-- 6. Функция на PL/pgSQL для обновления баллов студента
CREATE OR REPLACE FUNCTION update_score(student_id INT, new_score INT) RETURNS VOID AS $$
BEGIN
UPDATE students SET баллы = new_score WHERE id = student_id;
END;
$$ LANGUAGE plpgsql;
-- 7. Создание триггера для логирования изменений при добавлении/обновлении данных
CREATE OR REPLACE FUNCTION log_changes() RETURNS TRIGGER AS $$
BEGIN
RAISE NOTICE 'Данные изменены: %', NEW;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER students_changes
BEFORE INSERT OR UPDATE ON students
FOR EACH ROW EXECUTE FUNCTION log_changes();
-- 8. Создание материализованного представления с сортировкой по фамилии в обратном порядке
CREATE MATERIALIZED VIEW sorted_students AS
SELECT *, ROW_NUMBER() OVER (ORDER BY фамилия DESC) AS номер_строки
FROM students;
-- Готово! Теперь можно обновлять представление при необходимости:
REFRESH MATERIALIZED VIEW sorted_students;