2016-08-11 3 views
0

Я хотел бы иметь контроль над пользователями db для выбора таблиц в sql. Напр. Существует пользователь с именем «user1», а другой - «user2».Ограничить количество строк, возвращенных на основании роли пользователя

User1 имеет роль администратора в базе данных. Пользователь2 имеет меньшую роль. Когда пользователь запускает запрос, я хочу проверить имя пользователя и userrole, если это пользователь admin, а затем я разрешаю ему запускать. Если его более низкий пользователь роли, мне нужно ограничить результат запроса (не отрицать, просто ограничивать.) Для ex. Я не хочу, чтобы более низкая роль пользователя отображала столбец PhoneNumber в таблице, поэтому мне нужно предоставить этому пользователю результат в качестве таблицы, за исключением столбца PhoneNumber.

Я знаю, что могу сделать это на разрешениях столбцов в области ролей. Но я также хочу ограничить запрос следующим: просто верните верхний результат (5), а не всю таблицу.

Мне нужна хранимая процедура или что-то в этом роде, которая автоматически запускается, когда пользователь выполняет запрос. Есть ли какой-либо sp или что-то еще подобное в sql?

Заранее спасибо.

+2

Нет, не существует. И что вы подразумеваете под 'f5', вы предоставляете своим пользователям доступ к SSMS? Ваш лучший подход будет заключаться в том, чтобы удалить доступ с помощью ролей к ограниченным таблицам и разрешить результаты, выполнив против хранимых процедур. В хранимой процедуре вы можете проверить роли/права и вернуть то, что подходит. В качестве альтернативы вы можете использовать Sql Views и предоставить/ограничить права на эти виды. Все звуки записи кажутся мне взломанными, хотя, возможно, лучше переоценить фактические требования, а затем попытаться продвинуть это, особенно если пользователи уже имеют права использовать SSMS. – Igor

+0

Если приложение не является SSMS, что это такое? –

+0

они используют ssms для подключения к экземпляру sql. это не мой вопрос. Все, что мне нужно, - это контроль между «пользователем запускает запрос» и «sql возвращает результат». Мне нужно проверить запрос, который пользователь хочет запустить. то я решаю, что дать серверу sql, чтобы дать результаты, которые я хочу. –

ответ

1

Невозможно сделать это напрямую.

Вы можете сделать некоторые вещи с помощью функции таблицы, например, добавить предложение WHERE на основе роли пользователя. Но нет никакого способа сделать это с оператором TOP, поскольку это должно применяться последним.

В теории вы можете ввести SQL-переписывание с собственным вариантом sp_execute, но на практике это создаст огромные дыры для SQL-инъекций.

Варианты:

  1. Ручка ограничение на уровне приложений.
  2. Отменить разрешения SELECT на таблице и выставить их только с помощью хранимых процедур. Вероятно, вам понадобится много хранимых процедур для учета всех различных способов, которыми пользователи могут захотеть данные.
+0

Я думаю, что вы правы. Спасибо за ответ –

+0

Мне жаль, что я не был. Это звучит как полезная способность иметь. –

Смежные вопросы