powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как узнать права пользователя на операции над объектом?
20 сообщений из 20, страница 1 из 1
Как узнать права пользователя на операции над объектом?
    #32001522
MaxWhite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Используется Delphi. Через ADO достукиваюсь до MS SQL 7. При попытках выполнить запрещенную операцию славливаю исключения. Все работает, но хочется в пользовательском интерфейсе закрывать возможности для начала таких операций. Т.е. есть юзер, объект и операция возможная над объектом - очень хочется узнавать - разрешено юзеру с этим объектом такое делать?
...
Рейтинг: 0 / 0
Как узнать права пользователя на операции над объектом?
    #32001523
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очевидно здесь:

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.
...
Рейтинг: 0 / 0
Как узнать права пользователя на операции над объектом?
    #32001528
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сокращение ручной работы и более читабельный вид дает применение sp_helprotect
...
Рейтинг: 0 / 0
Как узнать права пользователя на операции над объектом?
    #32001533
MaxWhite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
"Нет, все понятно, но что конкретно..."
Проблем состоит в том, что юзер приписан к ролям, а там permissions распределены хитрым образом. И чтобы выделить результирующие значения приходится хитро просматривать все роли, а в них брать нужные значения... Короче, придется дублировать логику, которая должна быть где-то в сервере реализована. Вот как бы результат этой "логики" вытащить? чтобы получить "да" или "нет". Или я много требую, или не врубаюсь...
Спасибо за оказанную помощь.
...
Рейтинг: 0 / 0
Как узнать права пользователя на операции над объектом?
    #32001542
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наск. я понял, вопрос состоит в том, как получить полный список прав пользователя над объектами БД, включая и те, что даны ему напрямую, и те, к-ми он обладает косвенно через свое участие в ролях. Предлагается след.процедура:

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'

Похоже, что все работает.
...
Рейтинг: 0 / 0
Как узнать права пользователя на операции над объектом?
    #32001560
MaxWhite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это лихо. Хороший пример-урок.
Мой опыт не дорос еще до такого манипулирования хранимыми процедурами. Я-то думал такую обработку на стороне клиента устраивать, что не есть хорошо.
Я немножко довел эту процедурку, так чтобы она получала еще название объекта и акшион, а выдавала четкий ответ "Deny" или "Grant".
Все срабатывает четко.
Спасибо.
...
Рейтинг: 0 / 0
Как узнать права пользователя на операции над объектом?
    #32003844
Erika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мучаюсь с той же проблемой. Очень обрадовалась, найдя практически ответ на свой вопрос, и тут же попыталась реализовать.
Все работает, но остается одна проблемка - как учесть участников всторенных ролей сервера и базы данных(типа db_datawriter). sp_helprotect эти роли не отображает, а прербирать их все и угадывать за sql-server их разрешения - запутаться ведь моно. Есть sp_dbfixedrolepermission и sp_srvrolepermission, но они возвращают permission в свободной текстовой форме. Если кто-то решил этот вопрос - помогите. У меня разумения не хватает!
...
Рейтинг: 0 / 0
Как узнать права пользователя на операции над объектом?
    #32003914
sergey_dementyev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вся эта процедура работает слишком медленно (впрочем как и все построенное на использовании sp_helprotect). А никто не знает ничего побыстрее? И неужели нет документированных способов от Microsoft по такому серьезному вопросу?
...
Рейтинг: 0 / 0
Как узнать права пользователя на операции над объектом?
    #32003920
Victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно попробывать самому анализировать системные таблицы.
...
Рейтинг: 0 / 0
Как узнать права пользователя на операции над объектом?
    #32004074
Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А может кто знает более шустрый алгоритм? Или где можно почитать что-нибудь по этому вопросу,хотябы узнать какие таблицы в этом учавствуют. А то BOL молчит по этому поводу.
...
Рейтинг: 0 / 0
Как узнать права пользователя на операции над объектом?
    #32004075
Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А может кто знает более шустрый алгоритм? Или где можно почитать что-нибудь по этому вопросу,хотябы узнать какие таблицы в этом учавствуют. А то BOL молчит по этому поводу.
...
Рейтинг: 0 / 0
Как узнать права пользователя на операции над объектом?
    #32004078
Victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SergSuper указал таблицы: sysprotects , syspermissions.
Можно посмотреть код sp_helpprotect и модифицировать под собственные нужды
...
Рейтинг: 0 / 0
Как узнать права пользователя на операции над объектом?
    #32004082
Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Но ведь еще нужно узнать к каим ролям принадлежит пользователь, а из этих таблиц этого не узнаешь. А sp_helpprotect работает очень медленно, т.к. использует временные таблицы.
...
Рейтинг: 0 / 0
Как узнать права пользователя на операции над объектом?
    #32004083
Victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для ролей:
sysusers
sysmembers
...
Рейтинг: 0 / 0
Как узнать права пользователя на операции над объектом?
    #32004294
Erika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как говорится, ну если уж у Вас и в этом случае ничего не получилось, почитайте help! (Это я про себя)

Функция системная такая есть:
PERMISSIONS([objectid [, 'column']])
Returns a value containing a bitmap that indicates the statement, object, or column permissions for the current user.

Просто перейдя на sql server зациклилась на хранимых процедурах(и похоже не только я), а это простенькая такая функция. Все права возвращает абсолютно корректно, в том числе и полученные через встроенные роли!

Получилась из нее процедура, которую я поместила в БД master:

CREATE PROCEDURE sp_CheckPermissions
@objName varchar(30), @action varchar(10), @permission bit output AS
/*Возвращает разрешения для текущего прользователя на операции 'SELECT', 'INSERT', 'UPDATE', 'DELETE', 'EXECUTE'
true(1) - разрешено, false(0) - запрещено Null - объект отсутствует в текущей БД*/
Declare @pint int
Select @pint = permissions(object_id(@objName))

Set @permission = Null
if @pint is Null
return
if upper(@action) = 'SELECT'
begin
if @pint&0x1=0x1
Set @permission = 1
else
Set @permission = 0
end
else if upper(@action) = 'INSERT'
begin
if @pint&0x8=0x8
Set @permission = 1
else
Set @permission = 0
end
else if upper(@action) = 'UPDATE'
begin
if @pint&0x2=0x2
Set @permission = 1
else
Set @permission = 0
end
else if upper(@action) = 'DELETE'
begin
if @pint&0x10=0x10
Set @permission = 1
else
Set @permission = 0
end
else if upper(@action) = 'EXECUTE'
begin
if @pint&0x20=0x20
Set @permission = 1
else
Set @permission = 0
end

Естественно, сначала надо приконнектиться к соответствующей БД с соответствующим логином.
Критику принимаю - я в SQL servere не слишком опытна.
...
Рейтинг: 0 / 0
Как узнать права пользователя на операции над объектом?
    #32004299
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если хотите критику, то не касаясь метода, а только исполнения, я бы написал процедуру так:

CREATE PROCEDURE sp_CheckPermissions
@objName varchar(30), @action varchar(10), @permission bit output AS
/*Возвращает разрешения для текущего прользователя на операции 'SELECT', 'INSERT', 'UPDATE', 'DELETE', 'EXECUTE'
true(1) - разрешено, false(0) - запрещено Null - объект отсутствует в текущей БД*/
select 'EXECUTE' a, 0x20 b into #a
insert #a select 'SELECT', 0x1 union select 'INSERT' , 0x8 union select 'UPDATE' , 0x2 select 'DELETE' 0x10

Select @pint = permissions(object_id(@objName))

if exists(select * from #a where a=@action and @pint&b=b) Set @permission = 1
else Set @permission = 0

Таблицу #a можно сделать постоянной. Можно развить процедуру и проверять сразу несколько действий.
...
Рейтинг: 0 / 0
Как узнать права пользователя на операции над объектом?
    #32004314
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я пользуюсь следующей процедурой

CREATE PROCEDURE upGetPrivs (
@sObjName varchar(200), -- имя объекта
@sPrivs varchar(5) OUTPUT --- строка кодов (она обрабатывается в клиенте)
)
AS

declare @nPrivs integer;
begin

set @nPrivs = PERMISSIONS( OBJECT_ID(@sObjName) );

/*
Bit (dec) Bit (hex) Statement permission
1 0x1 SELECT ALL
2 0x2 UPDATE ALL
4 0x4 REFERENCES ALL
8 0x8 INSERT
16 0x10 DELETE
32 0x20 EXECUTE (procedures only)
4096 0x1000 SELECT ANY (at least one column)
8192 0x2000 UPDATE ANY
16384 0x4000 REFERENCES ANY
*/


set @sPrivs = '';
if (@nPrivs & 0x1 = 0x1) or (@nPrivs & 0x1000 = 0x1000)
set @sPrivs = @sPrivs + 'S';
if (@nPrivs & 0x2 = 0x2) or (@nPrivs & 0x2000 = 0x2000)
set @sPrivs = @sPrivs + 'U';
if @nPrivs & 0x8 = 0x8
set @sPrivs = @sPrivs + 'I';
if @nPrivs & 0x10 = 0x10
set @sPrivs = @sPrivs + 'D';
if @nPrivs & 0x20 = 0x20
set @sPrivs = @sPrivs + 'E' ;

end;
...
Рейтинг: 0 / 0
Как узнать права пользователя на операции над объектом?
    #32004323
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Алексей

Укорочу и Вашу процедуру

CREATE PROCEDURE upGetPrivs (
@sObjName varchar(200), -- имя объекта
@sPrivs varchar(5) OUTPUT --- строка кодов (она обрабатывается в клиенте)
)
AS

declare @nPrivs integer;
begin

set @nPrivs = PERMISSIONS( OBJECT_ID(@sObjName) );

select 'EXECUTE' a, 0x20 b into #a
insert #a select 'S', 0x1 union select 'I' , 0x8 union select 'U' , 0x2 union select 'D' 0x10 union select 'S' 0x1000 union select 'U' , 0x2000


set @sPrivs = '';
select @sPrivs=@sPrivs+a from #a where @nPrivs & b=b

end;
...
Рейтинг: 0 / 0
Как узнать права пользователя на операции над объектом?
    #32004324
Erika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To SergSuper:
Смотрится такой вариант конечно эстетичнее, но сразу возник вопрос - а не окажется ли процедура, обрабатывающая временные таблицы и конструкции SELECT медленнее, чем просто сравнивающая числовые значения? Очень прошу объяснить, если это не так!

To Алексей:
Как это мне самой не пришло в голову возвращать строку кодов! Где же вы все раньше были, когда так трудно искался ответ на вопрос о разрешениях
...
Рейтинг: 0 / 0
Как узнать права пользователя на операции над объектом?
    #32004328
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Erika
Если использовать постоянные таблицы или таблицы-переменные(sql2000) - то врядли будет медленнее. А занимает это тясячные доли секунды. Одна тысячная или две - какая разница?

Но в любом случае я своё время ценю дороже камнпутерного

И еще - наверное лучше строку кодов не возвращать, а передавать, т.е. чтобы процедура возвращала только можно или нет. Тогда можно использовать значение, которое она возвращает по RETURN.

Т.е. я бы написал как-то так:

CREATE PROCEDURE upGetPrivs (
@sObjName varchar(200), -- имя объекта
@sPrivs varchar(5) --- строка кодов
)
AS

declare @nPrivs integer, @ret int
begin

set @nPrivs = PERMISSIONS( OBJECT_ID(@sObjName) )

select 'EXECUTE' a, 0x20 b into #a
insert #a select 'S', 0x1 union select 'I' , 0x8 union select 'U' , 0x2 union select 'D' 0x10 union select 's' 0x1000 union select 'u' , 0x2000

if (select count(*) from #a where @sPrivs like '%'+a'+'%' and @nPrivs & b=b)= datalength(@sPrivs) set @ret=1 else set @ret=0

return @ret

end

Обратите внимание что в этом случае коды для SELECT и SELECT ANY должны быть разные.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как узнать права пользователя на операции над объектом?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]