Как узнать права пользователя на операции над объектом?

MaxWhite
Дата: 12.01.2001 16:23:22
Используется Delphi. Через ADO достукиваюсь до MS SQL 7. При попытках выполнить запрещенную операцию славливаю исключения. Все работает, но хочется в пользовательском интерфейсе закрывать возможности для начала таких операций. Т.е. есть юзер, объект и операция возможная над объектом - очень хочется узнавать - разрешено юзеру с этим объектом такое делать?
SergSuper
Дата: 12.01.2001 16:38:37
Очевидно здесь:

syspermissions (T-SQL)
Contains information about permissions that have been granted and denied to users, groups, and roles in the database. This table is stored in each database.

sysprotects (T-SQL)
Contains information about permissions that have been applied to security accounts with the GRANT and DENY statements. This table is stored in each database.
Дед Маздай
Дата: 13.01.2001 18:16:22
Сокращение ручной работы и более читабельный вид дает применение sp_helprotect
MaxWhite
Дата: 15.01.2001 11:09:26
"Нет, все понятно, но что конкретно..."
Проблем состоит в том, что юзер приписан к ролям, а там permissions распределены хитрым образом. И чтобы выделить результирующие значения приходится хитро просматривать все роли, а в них брать нужные значения... Короче, придется дублировать логику, которая должна быть где-то в сервере реализована. Вот как бы результат этой "логики" вытащить? чтобы получить "да" или "нет". Или я много требую, или не врубаюсь...
Спасибо за оказанную помощь.
Дед Маздай
Дата: 15.01.2001 17:21:35
Наск. я понял, вопрос состоит в том, как получить полный список прав пользователя над объектами БД, включая и те, что даны ему напрямую, и те, к-ми он обладает косвенно через свое участие в ролях. Предлагается след.процедура:

create proc AllRights @UserName sysname as

create table #UserInRoles (UserName sysname, GroupName sysname, LoginName sysname NULL,
DefDBName sysname NULL, UserID smallint, SID smallint)
insert #UserInRoles exec sp_helpuser @UserName

alter table #UserInRoles drop column UserName, LoginName, DefDBName, UserID, SID
insert #UserInRoles (GroupName) values ('public')

create table #RightsOnObjects (Owner sysname, Object sysname, Grantee sysname, Grantor sysname,
ProtectType char(10), [Action] varchar(20), [Column] sysname)
insert #RightsOnObjects exec sp_helprotect

select * from #RightsOnObjects where Grantee in (select GroupName from #UserInRoles) or Grantee = @UserName
order by Object, Action, [Column], ProtectType
go

Протестируем ее работу. Создадим login aaa, создадим в БД Northwind соотв-го ему юзера aaa. Дадим юзеру права на чтение из customers, отберем права на чтение из Employees. Создадим роль уровня БД aaa_role, включим в нее юзера ааа, отберем у роли права на чтение из orders. Вызовем процедуру:

exec AllRights 'aaa'

Похоже, что все работает.
MaxWhite
Дата: 16.01.2001 13:29:48
Это лихо. Хороший пример-урок.
Мой опыт не дорос еще до такого манипулирования хранимыми процедурами. Я-то думал такую обработку на стороне клиента устраивать, что не есть хорошо.
Я немножко довел эту процедурку, так чтобы она получала еще название объекта и акшион, а выдавала четкий ответ "Deny" или "Grant".
Все срабатывает четко.
Спасибо.
Erika
Дата: 02.04.2001 18:23:52
Мучаюсь с той же проблемой. Очень обрадовалась, найдя практически ответ на свой вопрос, и тут же попыталась реализовать.
Все работает, но остается одна проблемка - как учесть участников всторенных ролей сервера и базы данных(типа db_datawriter). sp_helprotect эти роли не отображает, а прербирать их все и угадывать за sql-server их разрешения - запутаться ведь моно. Есть sp_dbfixedrolepermission и sp_srvrolepermission, но они возвращают permission в свободной текстовой форме. Если кто-то решил этот вопрос - помогите. У меня разумения не хватает!
sergey_dementyev
Дата: 04.04.2001 14:40:11
Вся эта процедура работает слишком медленно (впрочем как и все построенное на использовании sp_helprotect). А никто не знает ничего побыстрее? И неужели нет документированных способов от Microsoft по такому серьезному вопросу?
Victor
Дата: 04.04.2001 16:43:10
Можно попробывать самому анализировать системные таблицы.
Sergey
Дата: 09.04.2001 14:55:42
А может кто знает более шустрый алгоритм? Или где можно почитать что-нибудь по этому вопросу,хотябы узнать какие таблицы в этом учавствуют. А то BOL молчит по этому поводу.