В 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.