Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Проблема с пользователями  [new]
Корниенко Василий
Member

Откуда:
Сообщений: 30
Доброго времени суток.

Имеется web-приложение с авторизацией через aspnet membership. Пользователей предполагается в районе 500 - 1000. Также есть ms sql сервер, сейчас для подключения к базе используется один пользователь. Но возникла проблема с выводом данных для разных пользователей, то есть один пользователь должен видеть одни данные, другой - другие, третий - все и т.д.
Фильтровать данные для каждого пользователя на уровне приложения не вариант, т.к. сильно теряется производительность.
Подскажите пожалуйста, каким образом можно поступить в этом случае.
5 мар 12, 14:17    [12196126]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с пользователями  [new]
на уровне уровня
Guest
Корниенко Василий,

кроме "на уровне приложения" какие есть варианты?
5 мар 12, 14:20    [12196151]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с пользователями  [new]
Корниенко Василий
Member

Откуда:
Сообщений: 30
на уровне уровня,

Данные выводятся через представления. Сейчас используется функция, которая определяет, какие данные каким пользователям доступны. Но для больших таблиц очень долго выполняется join функции и представления.

Видел отличное решение этой проблемы в системах, где используется Windows авторизация, с помощью функции SUSER_NAME() определяется пользователь и представления получаются уже отфильтрованными для определённого пользователя.
5 мар 12, 14:30    [12196304]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с пользователями  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Несколько варианотов.
Кошерный - завести пользователей в базе и установить олицетворение пользователя Web с пользователем SQL.
Альтернативный - контекст Web скопировать в контекст Sql (частично). Конкретно:
В sql есть переменная сессии CONTEXT_INFO. В неё например вы можете записать GUID Web сессии. А далее на SQL востановить всю нужную инфу. Или просто идентификатор пользователя, али ещё что. А прописывать в Proxy-Классе сразу после "соединения" (или как у вас там сделано).
5 мар 12, 14:35    [12196360]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с пользователями  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Корниенко Василий
Видел отличное решение этой проблемы в системах, где используется Windows авторизация, с помощью функции SUSER_NAME() определяется пользователь и представления получаются уже отфильтрованными для определённого пользователя.
Да, только это не по мановению волшебной палочки, а прямое ручное написание фильтра в представлении.

Корниенко Василий
Данные выводятся через представления. Сейчас используется функция, которая определяет, какие данные каким пользователям доступны. Но для больших таблиц очень долго выполняется join функции и представления.
Если вы перепишите через SUSER_NAME() (или CONTEXT_INFO) будут точно такие же тормоза. Наймиет спеца по SQL или научитесь разрабатывать запросы (может банально индексов нужных нет) и "читать" планы.
5 мар 12, 14:41    [12196457]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с пользователями  [new]
на уровне уровня
Guest
Корниенко Василий
для больших таблиц очень долго выполняется join функции и представления.

субд через что-нибудь кроме вьюхи позволяет возвращать данные?
отфильтровать можно только непосредственно аплаем/дхойном исходной большой таблицы на функцию или есть другие варианты?
производительность операций с большими таблицами - это "дано" или есть варианты решения этой проблемы?

Корниенко Василий
и представления получаются уже отфильтрованными для определённого пользователя.

просто какое-то волшебство.

всё уже, выросла програмулька из "выборки из вьюх".
вэлком в большие таблицы и сложные привилегии. и это не "быстрый вопрос" на форумик.
признаем модель и реализацию безнадежно устаревшими и переделываем.
5 мар 12, 14:43    [12196476]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с пользователями  [new]
Корниенко Василий
Member

Откуда:
Сообщений: 30
Mnior
Корниенко Василий
Видел отличное решение этой проблемы в системах, где используется Windows авторизация, с помощью функции SUSER_NAME() определяется пользователь и представления получаются уже отфильтрованными для определённого пользователя.
Да, только это не по мановению волшебной палочки, а прямое ручное написание фильтра в представлении.

Это понятно что нужно будет фильтр писать в представлении, просто не стал заострять на этом внимание, это как само собой разумеющееся.

Mnior
Корниенко Василий
Данные выводятся через представления. Сейчас используется функция, которая определяет, какие данные каким пользователям доступны. Но для больших таблиц очень долго выполняется join функции и представления.
Если вы перепишите через SUSER_NAME() (или CONTEXT_INFO) будут точно такие же тормоза. Наймиет спеца по SQL или научитесь разрабатывать запросы (может банально индексов нужных нет) и "читать" планы.

таких же "тормозов" быть не может, так как они появляются из-за функции, которая и без join'а выполняется секунд 5 даже если там простейший запрос
select xxID
From xxTable

сейчас пробую через CONTEXT_INFO сделать, надеюсь поможет
5 мар 12, 15:25    [12196921]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с пользователями  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Корниенко Василий
таких же "тормозов" быть не может, так как они появляются из-за функции, которая и без join'а выполняется секунд 5 даже если там простейший запрос
Т.е. есть некий запрос, определяюший "права" пользователя.
Если его тупо завернуть в функцию, то 5 секунд, а если тоже самое только в профиль, то мгновенно. Это как?

CONTEXT_INFO максимум что делает, это снимает явную параметризацию (@UserWeb), которую надо подавать в запрос, на неявную (dbo.vwUserInfo U JOIN ...) т.е. условия запихнуты глубоко в дебрях представлений.
Но условия и их логика таже.

Извините, я просто сильно придираюсь к сказаному, но всё же.
5 мар 12, 16:09    [12197389]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с пользователями  [new]
Корниенко Василий
Member

Откуда:
Сообщений: 30
Mnior,

я планирую изменить функционал разграничения данных, просто всё упиралось в то, как определить что за пользователь запускает определённое представление, теперь я смогу на более раннем этапе отсечь ненужные записи и соответственно увеличить производительность + у меня ещё возникали проблемы с часовыми поясами, которые теперь уйдут (естественно после определённых преобразований).
5 мар 12, 16:52    [12197899]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с пользователями  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Корниенко Василий
определённое представление, теперь я смогу на более раннем этапе отсечь ненужные записи и соответственно увеличить производительность
Вообще-то представление это не что-то отдельное, а тупо строка. Запрос с представлениями работает не каскадно а цельно. Соответственно все нужные отсечения оптимизатор расставит на нужные места. Никакой разницы не должно быть - поставили ли вы условия в начале или в конце.

А может быть вы просто не умеете писать правильно представления. Тогда у меня плохие новости - CONTEXT_INFO это даже не проблема, проблем с производительностью у вас на-а-амного больше.
Курите планы. Используйте все необходимые принципы при написании представлений.
Наводящий вопрос - вы в них пишите INNER JOIN?
12 мар 12, 00:21    [12228821]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить