Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как узнать права пользователя на операции над объектом?
|
|||
|---|---|---|---|
|
#18+
Используется Delphi. Через ADO достукиваюсь до MS SQL 7. При попытках выполнить запрещенную операцию славливаю исключения. Все работает, но хочется в пользовательском интерфейсе закрывать возможности для начала таких операций. Т.е. есть юзер, объект и операция возможная над объектом - очень хочется узнавать - разрешено юзеру с этим объектом такое делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2001, 16:23 |
|
||
|
Как узнать права пользователя на операции над объектом?
|
|||
|---|---|---|---|
|
#18+
Очевидно здесь: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2001, 16:38 |
|
||
|
Как узнать права пользователя на операции над объектом?
|
|||
|---|---|---|---|
|
#18+
Сокращение ручной работы и более читабельный вид дает применение sp_helprotect ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2001, 18:16 |
|
||
|
Как узнать права пользователя на операции над объектом?
|
|||
|---|---|---|---|
|
#18+
"Нет, все понятно, но что конкретно..." Проблем состоит в том, что юзер приписан к ролям, а там permissions распределены хитрым образом. И чтобы выделить результирующие значения приходится хитро просматривать все роли, а в них брать нужные значения... Короче, придется дублировать логику, которая должна быть где-то в сервере реализована. Вот как бы результат этой "логики" вытащить? чтобы получить "да" или "нет". Или я много требую, или не врубаюсь... Спасибо за оказанную помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2001, 11:09 |
|
||
|
Как узнать права пользователя на операции над объектом?
|
|||
|---|---|---|---|
|
#18+
Наск. я понял, вопрос состоит в том, как получить полный список прав пользователя над объектами БД, включая и те, что даны ему напрямую, и те, к-ми он обладает косвенно через свое участие в ролях. Предлагается след.процедура: 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' Похоже, что все работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2001, 17:21 |
|
||
|
Как узнать права пользователя на операции над объектом?
|
|||
|---|---|---|---|
|
#18+
Это лихо. Хороший пример-урок. Мой опыт не дорос еще до такого манипулирования хранимыми процедурами. Я-то думал такую обработку на стороне клиента устраивать, что не есть хорошо. Я немножко довел эту процедурку, так чтобы она получала еще название объекта и акшион, а выдавала четкий ответ "Deny" или "Grant". Все срабатывает четко. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2001, 13:29 |
|
||
|
Как узнать права пользователя на операции над объектом?
|
|||
|---|---|---|---|
|
#18+
Мучаюсь с той же проблемой. Очень обрадовалась, найдя практически ответ на свой вопрос, и тут же попыталась реализовать. Все работает, но остается одна проблемка - как учесть участников всторенных ролей сервера и базы данных(типа db_datawriter). sp_helprotect эти роли не отображает, а прербирать их все и угадывать за sql-server их разрешения - запутаться ведь моно. Есть sp_dbfixedrolepermission и sp_srvrolepermission, но они возвращают permission в свободной текстовой форме. Если кто-то решил этот вопрос - помогите. У меня разумения не хватает! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2001, 18:23 |
|
||
|
Как узнать права пользователя на операции над объектом?
|
|||
|---|---|---|---|
|
#18+
Вся эта процедура работает слишком медленно (впрочем как и все построенное на использовании sp_helprotect). А никто не знает ничего побыстрее? И неужели нет документированных способов от Microsoft по такому серьезному вопросу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2001, 14:40 |
|
||
|
Как узнать права пользователя на операции над объектом?
|
|||
|---|---|---|---|
|
#18+
Можно попробывать самому анализировать системные таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2001, 16:43 |
|
||
|
Как узнать права пользователя на операции над объектом?
|
|||
|---|---|---|---|
|
#18+
А может кто знает более шустрый алгоритм? Или где можно почитать что-нибудь по этому вопросу,хотябы узнать какие таблицы в этом учавствуют. А то BOL молчит по этому поводу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2001, 14:55 |
|
||
|
Как узнать права пользователя на операции над объектом?
|
|||
|---|---|---|---|
|
#18+
А может кто знает более шустрый алгоритм? Или где можно почитать что-нибудь по этому вопросу,хотябы узнать какие таблицы в этом учавствуют. А то BOL молчит по этому поводу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2001, 14:55 |
|
||
|
Как узнать права пользователя на операции над объектом?
|
|||
|---|---|---|---|
|
#18+
SergSuper указал таблицы: sysprotects , syspermissions. Можно посмотреть код sp_helpprotect и модифицировать под собственные нужды ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2001, 15:51 |
|
||
|
Как узнать права пользователя на операции над объектом?
|
|||
|---|---|---|---|
|
#18+
Но ведь еще нужно узнать к каим ролям принадлежит пользователь, а из этих таблиц этого не узнаешь. А sp_helpprotect работает очень медленно, т.к. использует временные таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2001, 16:21 |
|
||
|
Как узнать права пользователя на операции над объектом?
|
|||
|---|---|---|---|
|
#18+
Для ролей: sysusers sysmembers ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2001, 16:23 |
|
||
|
Как узнать права пользователя на операции над объектом?
|
|||
|---|---|---|---|
|
#18+
Как говорится, ну если уж у Вас и в этом случае ничего не получилось, почитайте 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 не слишком опытна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2001, 12:04 |
|
||
|
Как узнать права пользователя на операции над объектом?
|
|||
|---|---|---|---|
|
#18+
Если хотите критику, то не касаясь метода, а только исполнения, я бы написал процедуру так: 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 можно сделать постоянной. Можно развить процедуру и проверять сразу несколько действий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2001, 12:49 |
|
||
|
Как узнать права пользователя на операции над объектом?
|
|||
|---|---|---|---|
|
#18+
Я пользуюсь следующей процедурой 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; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2001, 15:24 |
|
||
|
Как узнать права пользователя на операции над объектом?
|
|||
|---|---|---|---|
|
#18+
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; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2001, 16:47 |
|
||
|
Как узнать права пользователя на операции над объектом?
|
|||
|---|---|---|---|
|
#18+
To SergSuper: Смотрится такой вариант конечно эстетичнее, но сразу возник вопрос - а не окажется ли процедура, обрабатывающая временные таблицы и конструкции SELECT медленнее, чем просто сравнивающая числовые значения? Очень прошу объяснить, если это не так! To Алексей: Как это мне самой не пришло в голову возвращать строку кодов! Где же вы все раньше были, когда так трудно искался ответ на вопрос о разрешениях ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2001, 17:12 |
|
||
|
Как узнать права пользователя на операции над объектом?
|
|||
|---|---|---|---|
|
#18+
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 должны быть разные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2001, 17:59 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32004324&tid=1826997]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
56ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
| others: | 268ms |
| total: | 435ms |

| 0 / 0 |
