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


Как опытный разработчик, я разберу эту задачу по шагам. Мы будем работать с **Microsoft SQL Server**. Весь процесс разбит на логические этапы: от понимания теории до написания кода и настройки уведомлений.

---

### Этап 1: Теория (Ответы на вопросы билета)

#### 1. Что такое аудит и отслеживание событий?
**Аудит** — это механизм проверки и записи всех действий, которые происходят в базе данных. Представь это как камеру видеонаблюдения: она фиксирует, кто зашел (логин), что взял или изменил (SQL-запрос) и когда это случилось.

В SQL Server аудит настраивается через два объекта:
1.  **Server Audit**: определяет, *куда* записывать данные (в файл, в журнал Windows).
2.  **Audit Specification**: определяет, *что именно* записывать (вход в систему, удаление таблицы, изменение данных).

#### 2. Защита данных
Защита строится на «трех китах»:
*   **Управление доступом**: Мы создаем **Роли** (например, «Бухгалтер», «Админ»). Мы не даем права конкретному человеку, мы даем права роли, а пользователя добавляем в эту роль.
*   **Политики безопасности (RLS)**: Позволяют скрыть строки. Например, менеджер из Москвы видит только московских клиентов, хотя все данные лежат в одной таблице.
*   **Шифрование**: 
    *   *TDE*: Шифрует всю базу на диске (если диск украдут, данные не прочтут).
    *   *Always Encrypted*: Данные зашифрованы даже в оперативной памяти сервера, ключ только у клиента.

---

### Этап 2: Подготовка окружения
Прежде чем настраивать аудит, нам нужна сама база и таблица. Выполни этот код, чтобы создать их:

```sql
CREATE DATABASE ExamDB;
GO

USE ExamDB;
GO

CREATE TABLE Users (
    UserID INT PRIMARY KEY IDENTITY(1,1),
    UserName NVARCHAR(100),
    UserEmail NVARCHAR(100),
    CreatedAt DATETIME DEFAULT GETDATE()
);
GO
```

---

### Этап 3: Настройка аудита таблицы
Теперь настроим слежку за изменениями (INSERT, UPDATE, DELETE) в нашей таблице.

**1. Создаем объект аудита (куда пишем лог):**
*Важно: папка `C:\AuditLog` должна существовать на диске.*

```sql
USE master;
GO

CREATE SERVER AUDIT MyTableAudit
TO FILE (FILEPATH = 'C:\AuditLog\');
GO

ALTER SERVER AUDIT MyTableAudit WITH (STATE = ON);
GO
```

**2. Создаем спецификацию (за чем именно следим):**

```sql
USE ExamDB;
GO

CREATE DATABASE AUDIT SPECIFICATION Audit_Users_Changes
FOR SERVER AUDIT MyTableAudit
ADD (INSERT, UPDATE, DELETE ON OBJECT::dbo.Users BY public)
WITH (STATE = ON);
GO
```

---

### Этап 4: Генерация отчета за месяц
Чтобы посмотреть, что произошло за последние 30 дней, мы используем системную функцию для чтения файла лога.

```sql
SELECT 
    event_time AS [Время],
    action_id AS [Действие],
    session_server_principal_name AS [Кто изменил],
    object_name AS [Таблица],
    statement AS [Текст запроса]
FROM sys.fn_get_audit_file('C:\AuditLog\*', DEFAULT, DEFAULT)
WHERE event_time >= DATEADD(MONTH, -1, GETDATE())
ORDER BY event_time DESC;
```

---

### Этап 5: Настройка Database Mail
Чтобы SQL Server мог отправлять письма, нужно включить этот компонент и создать профиль.

**1. Включаем компонент:**
```sql
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'Database Mail XPs', 1;
RECONFIGURE;
```

**2. Создаем профиль (настройки почты):**
*Замени параметры на свои (сервер, почта).*

```sql
EXECUTE msdb.dbo.sysmail_add_account_sp
    @account_name = 'GmailAccount',
    @email_address = 'your_email@gmail.com',
    @mailserver_name = 'smtp.gmail.com';

EXECUTE msdb.dbo.sysmail_add_profile_sp
    @profile_name = 'AdminNotifyProfile';

EXECUTE msdb.dbo.sysmail_add_profileaccount_sp
    @profile_name = 'AdminNotifyProfile',
    @account_name = 'GmailAccount',
    @sequence_number = 1;
```

---

### Этап 6: Уведомление через триггер
Аудит просто записывает в файл, но он не умеет мгновенно "кричать" об изменениях. Для уведомлений в реальном времени мы создадим **триггер**.

```sql
CREATE TRIGGER trg_UserChanged_Notify
ON dbo.Users
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
    SET NOCOUNT ON;
    
    DECLARE @bodyText NVARCHAR(MAX);
    SET @bodyText = 'В таблице Users произошло изменение. Время: ' + CAST(GETDATE() AS NVARCHAR(30));

    EXEC msdb.dbo.sp_send_dbmail
        @profile_name = 'AdminNotifyProfile',
        @recipients = 'admin@example.com',
        @body = @bodyText,
        @subject = 'Внимание: Изменение данных в БД';
END;
GO
```

### Итог:
1.  Мы создали таблицу `Users`.
2.  Настроили **Server Audit** для записи всех действий в файл.
3.  Написали SQL-запрос для выгрузки отчета за **последний месяц**.
4.  Настроили **Database Mail** и создали **триггер**, который автоматически отправляет письмо администратору сразу после любого изменения в таблице.