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


В PostgreSQL знаки `$$` — это просто специальные «кавычки» для кода. Без них код превратится в кашу из кавычек, которую почти невозможно написать без ошибок. В PostgreSQL это стандарт.

Вот проект с нуля. Делай всё строго по порядку.

### Шаг 1: Создание таблиц
Открой **Query Tool** в новой базе данных, вставь этот код и нажми **F5**:

```sql
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username TEXT NOT NULL,
    email TEXT
);

CREATE TABLE users_log (
    log_id SERIAL PRIMARY KEY,
    user_id INT,
    operation TEXT,
    changed_by TEXT,
    changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    data_json JSONB
);
```

### Шаг 2: Создание логики (функция и триггер)
Удали старый код из окна, вставь этот и нажми **F5**:

```sql
CREATE OR REPLACE FUNCTION log_changes()
RETURNS TRIGGER AS $$
BEGIN
    IF (TG_OP = 'DELETE') THEN
        INSERT INTO users_log (user_id, operation, changed_by, data_json)
        VALUES (OLD.id, TG_OP, current_user, to_jsonb(OLD));
    ELSE
        INSERT INTO users_log (user_id, operation, changed_by, data_json)
        VALUES (NEW.id, TG_OP, current_user, to_jsonb(NEW));
    END IF;

    PERFORM pg_notify('audit_chan', 'Изменение: ' || TG_OP);

    IF (TG_OP = 'DELETE') THEN RETURN OLD; ELSE RETURN NEW; END IF;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trg_users_audit
AFTER INSERT OR UPDATE OR DELETE ON users
FOR EACH ROW EXECUTE FUNCTION log_changes();
```

### Шаг 3: Настройка уведомлений
Очисти окно, введи это и нажми **F5**:

```sql
LISTEN audit_chan;
```
*(Теперь база готова показывать уведомления во вкладке Messages)*.

### Шаг 4: Проверка (что делать при учителе)

**1. Добавь данные (чтобы появились записи):**
```sql
INSERT INTO users (username, email) VALUES ('test_user', 'test@mail.com');
UPDATE users SET email = 'updated@mail.com' WHERE id = 1;
```

**2. Покажи уведомление:**
Нажми снизу на вкладку **Messages**. Там будет строка: 
`Asynchronous notification "audit_chan" with payload "Изменение: INSERT"...`

**3. Выведи отчет за последний месяц:**
```sql
SELECT * FROM users_log 
WHERE changed_at >= NOW() - INTERVAL '1 month' 
ORDER BY changed_at DESC;
```

---

### Ответы для экзамена (Теория):

1.  **Что такое аудит?** Это механизм записи всех действий пользователей в базе данных. Я реализовал его через таблицу `users_log` и триггер, который ловит изменения.
2.  **Как настроить уведомления?** В PostgreSQL я использовал механизм `NOTIFY`. Когда данные меняются, триггер посылает сигнал, который может перехватить любое внешнее приложение для отправки Email.
3.  **Как защитить данные?** 
    *   **Управление доступом:** Использование ролей и прав доступа (GRANT/REVOKE).
    *   **RLS (Row Level Security):** Настройка политик, чтобы пользователи видели только свои строки.
    *   **Шифрование:** Использование расширения `pgcrypto` для шифрования чувствительных данных.

**Всё, проект готов.** Это минимальный и правильный код для PostgreSQL.