Pull to refresh

Подход к разделению схем (пользователей) при проектировании OLTP баз данных

Reading time 2 min
Views 6.2K

Проблематика и назначение:


Разделение схем в основе своей реализуется для масштабируемости и безопасности:

  • Масштабируемость с точки зрения баз данных должна быть такой, чтобы схему можно было вынести в другую базу без ущерба функционалу.
  • Безопасность с точки зрения баз данных должна быть такой, чтобы внешние пользователи оперировали только бизнес логикой, к которой раздаются гранты, и не имели доступа к первичным данным.

Проблематика есть в том что если мы будем давать гранты на модификацию данных не владельцем таблиц (первичных данных), мы получаем пласт проблем:

  • Проблема с масштабируемостью — нет возможность разнести схемы в разные бд.
  • Проблема с безопасностью — при получении доступа к одной схеме, получаем доступ к первичным данным другой схемы.
  • Проблема с прозрачностью поведения системы — Нет возможности понять откуда производится модификация данных схемы, что приводит к непредсказуемому поведению системы.

Метод решения проблем:


Решение проблем с масштабируемостью/безопасностью/прозрачностью поведения системы нам поможет:

  • Инкапсуляция DML внутри схемы — всё управление транзакциями, а также DML операции осуществляется в рамках схемы-владельца таблицы.

Описание архитектуры предложенного метода:


image
Рисунок 1 — Взаимодействие схем между друг другом

Из рисунка видно, что схемы взаимодействуют между друг другом посредством GATE_PACKAGE или гейтовых пакетов.

Есть 2 типа гейтовых пакетов:

  • gate_package_in — для входящих запросов к схеме.
  • gate_package_out- для исходящих запросов из схемы в другую схему.

Все изменения данных осуществляются внутри схемы, прямого DML (insert, update, delete) обращения из чужой схемы (не владелице таблицы) к таблице не происходит.
Обращение из чужой схемы к любым методам/константам/типам и другим объектам также производится через гейтовые пакеты.

Такое взаимодействие позволяет иметь одну точку выхода и входа из/в схему, а в с случае разнесения схем в разные БД, мы получим следующую схему взаимодействия:

image

Рисунок 2 — Взаимодействие схем при разнесении их в разные БД.

Из рисунка видно, что при разнесении схем в разные БД у нас поддерживается принцип масштабирования, т.е. 2 схемы разнеслись в разные БД без ущерба основному функционалу.
Представим какие проблемы могли возникнуть при прямых DML из одной схемы в другую.
Ниже представлен рисунок раздачи грантов при взаимодействии 2х схем: поддержка текущей структуры масштабирования, безопасности, а также исключение неопределенности с точки зрения поведения системы:

image

Рисунок 3 — Схема раздачи грантов при взаимодействии 2х схем.

Из рисунка видно что мы запретили DML операции insert, update, delete, а также execute на объекты одной схемы в другую, кроме in_gate_package.

Разрешаем запуск из гейтовых пакетов, а также возможны запросы из табличек другой схемы, только в случае проблем с производительностью и необходимостью использования табличек в рамках больших запросов.

В идеале в дальнейшем запретить грант select относительно таблиц другой схемы и использовать только методы их гейтового пакета.

При таких подходах (рисунок 1, 2, 3), мы получаем:

  • Решение проблемы с масштабируемостью — Нет проблем при разнесении схем в разные БД.
  • Решение проблемы с безопасностью — запрет модификации данных и прямого обращения к методам/объектам для модификации первичны данных не владельцем этих данных.
  • Решение проблемы с прозрачность поведение системы — любая модификация данных происходит через одну входную/выходную точку в рамках одной схемы.
Tags:
Hubs:
+5
Comments 4
Comments Comments 4

Articles