Коллеги, есть проблема и вопрос с ограничением на видимость записей.
MS SQL 2016.
Нужно ограничить видимость записей в таблице. Эта таблица участвует практически во всех запросах.
Так как большое легаси, то переход на вьюшки несколько затруднителен.
Пробовали решение с RLS. При росте количества пользователей, база останавливается вообще.
Можно ли попросить MS SQL о следующем:
если идёт select в таблицу от роли sa, то делать этот select. иначе делать select из специализированной view. не переписывая сами запросы, тоесть настройками и правилами.
или
можно ли НЕ применять RLS к роли sa, а ко всем остальным ролям применять?
Здравствуйте, Kvazimodo75, Вы писали:
K>Коллеги, есть проблема и вопрос с ограничением на видимость записей.
K>MS SQL 2016.
K>Нужно ограничить видимость записей в таблице. Эта таблица участвует практически во всех запросах.
K>Так как большое легаси, то переход на вьюшки несколько затруднителен.
K>Пробовали решение с RLS. При росте количества пользователей, база останавливается вообще.
Поясните, почему? Что видно в плане исполнения? RLS очень зависима от индексов — если они не коррелируют со структурой запросов, то все будет тормозить.
Если записей слишком много, есть ли у вас патриции?
K>Можно ли попросить MS SQL о следующем:
K>если идёт select в таблицу от роли sa, то делать этот select. иначе делать select из специализированной view. не переписывая сами запросы, тоесть настройками и правилами.
Конечно, можно написать IF и проверять роль текущего аккаунта и потом брать соответствующую ветку. Хотя, мне кажется более интересный вариант — создать материальную вьюху с нормальным набором индексов, чтобы поддержать RLS и оттюнинговать запросы (убедиться, что нет всяких SELECT * и COUNT(*), что выбираются только нужные записи в каждом позапросе, а не все подряд и т.п.)
K>или
K>можно ли НЕ применять RLS к роли sa, а ко всем остальным ролям применять?
Сомневаюсь, что такое возможно.
K>если идёт select в таблицу от роли sa, то делать этот select. иначе делать select из специализированной view. не переписывая сами запросы, тоесть настройками и правилами.
теоретически есть default schema, и если вы ее в запросе не указываете явно, то биндинг может идти как к таблице [dbo].MyTable так и к вьюшке [restricted].[MyTable]
но я не пробовал, хз как там на практике
Здравствуйте, Kvazimodo75, Вы писали:
K>Пробовали решение с RLS. При росте количества пользователей, база останавливается вообще. K>Можно ли попросить MS SQL о следующем: K>если идёт select в таблицу от роли sa, то делать этот select. иначе делать select из специализированной view.
Думаете, c view база не "остановится" так же, как с RLS? Запросы-то, по сути те же будут выполняться.
Или вы как-то не так RLS сделали.
А вообще, легаси оно такое. Начиная с определенного момента, либо железо наращивать, либо переписывать.