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

Откуда:
Сообщений: 72
Здравствуйте !
Есть пользователь - slava
Есть роль базы данных - TestRole
Пользователю назначена эта роль
Функция Is_Member возвращает НОЛЬ.
Как с этим бороться ?

Вот скрин

К сообщению приложен файл. Размер - 13Kb
25 май 18, 08:32    [21438810]     Ответить | Цитировать Сообщить модератору
 Re: война с Is_Member  [new]
invm
Member

Откуда: Москва
Сообщений: 9115
SUSER_SID() добавьте в свой запрос. Членом роли может оказаться совсем другой "slava".
25 май 18, 09:09    [21438893]     Ответить | Цитировать Сообщить модератору
 Re: война с Is_Member  [new]
Petrashkevich
Member

Откуда:
Сообщений: 72
Не, slava один

К сообщению приложен файл. Размер - 16Kb
25 май 18, 11:30    [21439517]     Ответить | Цитировать Сообщить модератору
 Re: война с Is_Member  [new]
Petrashkevich
Member

Откуда:
Сообщений: 72
Вот свойства роли

К сообщению приложен файл. Размер - 32Kb
25 май 18, 11:33    [21439531]     Ответить | Цитировать Сообщить модератору
 Re: война с Is_Member  [new]
invm
Member

Откуда: Москва
Сообщений: 9115
Покажите результат select @@version
25 май 18, 11:59    [21439666]     Ответить | Цитировать Сообщить модератору
 Re: война с Is_Member  [new]
Petrashkevich
Member

Откуда:
Сообщений: 72
Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64)   Jun 28 2012 08:36:30   Copyright (c) Microsoft Corporation  Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) 
25 май 18, 12:13    [21439717]     Ответить | Цитировать Сообщить модератору
 Re: война с Is_Member  [new]
invm
Member

Откуда: Москва
Сообщений: 9115
Petrashkevich,

Значит ваш slava член серверной роли sysadmin.
25 май 18, 12:34    [21439815]     Ответить | Цитировать Сообщить модератору
 Re: война с Is_Member  [new]
Petrashkevich
Member

Откуда:
Сообщений: 72
invm
Значит ваш slava член серверной роли sysadmin.

Ну да, он сисадмин, но в роли то состоит.
Как узнать состоит пользователь в роли или нет ?
25 май 18, 13:07    [21439970]     Ответить | Цитировать Сообщить модератору
 Re: война с Is_Member  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Petrashkevich
invm
Значит ваш slava член серверной роли sysadmin.

Ну да, он сисадмин, но в роли то состоит.
Как узнать состоит пользователь в роли или нет ?

научится читать хелп

автор
Members of the sysadmin fixed server role enter every database as the dbo user. Checking permission for member of the sysadmin fixed server role, checks permissions for dbo, not the original login. Since dbo can't be added to a database role and doesn’t exist in Windows groups, dbo will always return 0 (or NULL if the role doesn't exist).

25 май 18, 13:09    [21439983]     Ответить | Цитировать Сообщить модератору
 Re: война с Is_Member  [new]
Petrashkevich
Member

Откуда:
Сообщений: 72
Так будет правильно ?
select Result = IS_MEMBER('TestRole') | IS_MEMBER('dbo')
25 май 18, 13:27    [21440070]     Ответить | Цитировать Сообщить модератору
 Re: война с Is_Member  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30712
Petrashkevich,


Petrashkevich
Так будет правильно ?
select Result = IS_MEMBER('TestRole') | IS_MEMBER('dbo')
Нет, конечно, такой скрипт покажет для dbo, что он входит в группу TestRole, даже если это не так.
Нужно смотреть по системным таблицам.
25 май 18, 13:35    [21440098]     Ответить | Цитировать Сообщить модератору
 Re: война с Is_Member  [new]
invm
Member

Откуда: Москва
Сообщений: 9115
Petrashkevich,

Правильно будет
is_member('TestRole') = 1 or is_srvrolemember('sysadmin') = 1
25 май 18, 13:38    [21440111]     Ответить | Цитировать Сообщить модератору
 Re: война с Is_Member  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30712
invm
Petrashkevich,

Правильно будет
is_member('TestRole') = 1 or is_srvrolemember('sysadmin') = 1
эээ, этот скрипт вернёт 1, если пользователь в группе TestRole, и 0, если нет???
25 май 18, 13:42    [21440129]     Ответить | Цитировать Сообщить модератору
 Re: война с Is_Member  [new]
Petrashkevich
Member

Откуда:
Сообщений: 72
А так ?
 select Result = case when 
   exists(select *
            from sys.database_principals G
              inner join sys.database_role_members M on g.principal_id = m.role_principal_id
              inner join sys.database_principals U on u.principal_id = m.member_principal_id and u.name = SUSER_SNAME()
           where G.name = @rolename) 
           then 1 else 0 end
25 май 18, 14:13    [21440301]     Ответить | Цитировать Сообщить модератору
 Re: война с Is_Member  [new]
invm
Member

Откуда: Москва
Сообщений: 9115
alexeyvg
эээ, этот скрипт вернёт 1, если пользователь в группе TestRole, и 0, если нет???
Этот скрипт проверит членство в роли, согласно модели безопасности.
Petrashkevich
А так ?
Не будет работать, если пользователь входит в роль опосредованно, через членчтво в другой роли.
25 май 18, 14:23    [21440357]     Ответить | Цитировать Сообщить модератору
 Re: война с Is_Member  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30712
Petrashkevich
А так ?
Можно посмотреть, как это делает SSMS. Профайлером.
+
declare @_msparam_0 nvarchar(4000) = N'ваша роль',@_msparam_1 nvarchar(4000) = N'ваша роль',@_msparam_2 nvarchar(4000) = N'ваша роль'

set NOCOUNT OFF
CREATE TABLE #tmp_role_member_ids (id int not null, role_id int null, sub_role_id int null, generation int null)
declare @generation int
set @generation = 0
INSERT INTO #tmp_role_member_ids (id) SELECT
rl.principal_id AS [ID]
FROM
sys.database_principals AS rl
WHERE
(rl.type = 'R')and(rl.name=@_msparam_0)
UPDATE #tmp_role_member_ids SET role_id = id, sub_role_id = id, generation=@generation
WHILE ( 1=1 )
BEGIN
	INSERT INTO #tmp_role_member_ids (id, role_id, sub_role_id, generation)
		SELECT a.member_principal_id, b.role_id, a.role_principal_id, @generation + 1
            FROM sys.database_role_members AS a INNER JOIN #tmp_role_member_ids AS b
			ON a.role_principal_id = b.id
            WHERE b.generation = @generation
	if @@ROWCOUNT <= 0
		break
	set @generation = @generation + 1
END
DELETE #tmp_role_member_ids WHERE id in (SELECT
rl.principal_id AS [ID]
FROM
sys.database_principals AS rl
WHERE
(rl.type = 'R')and(rl.name=@_msparam_1) )
UPDATE #tmp_role_member_ids SET generation = 0;
INSERT INTO #tmp_role_member_ids (id, role_id, generation) 
    SELECT distinct id, role_id, 1 FROM #tmp_role_member_ids
DELETE #tmp_role_member_ids WHERE generation = 0



SELECT
u.name AS [Name]
FROM
sys.database_principals AS rl
INNER JOIN #tmp_role_member_ids AS m ON m.role_id=rl.principal_id
INNER JOIN sys.database_principals AS u ON u.principal_id = m.id
WHERE
(rl.type = 'R')and(rl.name=@_msparam_2)
ORDER BY
[Name] ASC

			drop table #tmp_role_member_ids
26 май 18, 01:36    [21442083]     Ответить | Цитировать Сообщить модератору
 Re: война с Is_Member  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30712
invm
alexeyvg
эээ, этот скрипт вернёт 1, если пользователь в группе TestRole, и 0, если нет???
Этот скрипт проверит членство в роли, согласно модели безопасности.
Человеку надо, как я понял, проверить, будет ли показываться пользователь в окошке свойств роли. Как на скриншоте 21439531
26 май 18, 01:38    [21442085]     Ответить | Цитировать Сообщить модератору
 Re: война с Is_Member  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5619
alexeyvg
Можно посмотреть, как это делает SSMS. Профайлером.

Интересно. Согласно справке, IS_MEMBER еще и определяет членство в группе windows, и делает это по access tokens - однако в коде ни обращений к sys.login_token, ни еще куда-то.
26 май 18, 04:03    [21442113]     Ответить | Цитировать Сообщить модератору
 Re: война с Is_Member  [new]
aleks222
Member

Откуда:
Сообщений: 847
Сон Веры Павловны
alexeyvg
Можно посмотреть, как это делает SSMS. Профайлером.

Интересно. Согласно справке, IS_MEMBER еще и определяет членство в группе windows, и делает это по access tokens - однако в коде ни обращений к sys.login_token, ни еще куда-то.


Патаму, что это делается обращением к стандартному API Windows.
27 май 18, 10:20    [21443715]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить