Загрузка данных
Как опытный разработчик, я разберу эту задачу по шагам. Мы будем работать с **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** и создали **триггер**, который автоматически отправляет письмо администратору сразу после любого изменения в таблице.