Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / война с Is_Member / 19 сообщений из 19, страница 1 из 1
25.05.2018, 08:32
    #39649674
Petrashkevich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
война с Is_Member
Здравствуйте !
Есть пользователь - slava
Есть роль базы данных - TestRole
Пользователю назначена эта роль
Функция Is_Member возвращает НОЛЬ.
Как с этим бороться ?

Вот скрин
...
Рейтинг: 0 / 0
25.05.2018, 09:09
    #39649683
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
война с Is_Member
SUSER_SID() добавьте в свой запрос. Членом роли может оказаться совсем другой "slava".
...
Рейтинг: 0 / 0
25.05.2018, 11:30
    #39649781
Petrashkevich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
война с Is_Member
Не, slava один
...
Рейтинг: 0 / 0
25.05.2018, 11:33
    #39649782
Petrashkevich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
война с Is_Member
Вот свойства роли
...
Рейтинг: 0 / 0
25.05.2018, 11:59
    #39649797
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
война с Is_Member
Покажите результат select @@version
...
Рейтинг: 0 / 0
25.05.2018, 12:13
    #39649811
Petrashkevich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
война с Is_Member
Код: sql
1.
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) 
...
Рейтинг: 0 / 0
25.05.2018, 12:34
    #39649831
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
война с Is_Member
Petrashkevich,

Значит ваш slava член серверной роли sysadmin.
...
Рейтинг: 0 / 0
25.05.2018, 13:07
    #39649856
Petrashkevich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
война с Is_Member
invmЗначит ваш slava член серверной роли sysadmin.
Ну да, он сисадмин, но в роли то состоит.
Как узнать состоит пользователь в роли или нет ?
...
Рейтинг: 0 / 0
25.05.2018, 13:09
    #39649859
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
война с Is_Member
PetrashkevichinvmЗначит ваш 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).
...
Рейтинг: 0 / 0
25.05.2018, 13:27
    #39649872
Petrashkevich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
война с Is_Member
Так будет правильно ?
Код: sql
1.
select Result = IS_MEMBER('TestRole') | IS_MEMBER('dbo')
...
Рейтинг: 0 / 0
25.05.2018, 13:35
    #39649879
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
война с Is_Member
Petrashkevich,


PetrashkevichТак будет правильно ?
Код: sql
1.
select Result = IS_MEMBER('TestRole') | IS_MEMBER('dbo')

Нет, конечно, такой скрипт покажет для dbo, что он входит в группу TestRole, даже если это не так.
Нужно смотреть по системным таблицам.
...
Рейтинг: 0 / 0
25.05.2018, 13:38
    #39649884
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
война с Is_Member
Petrashkevich,

Правильно будет
Код: sql
1.
is_member('TestRole') = 1 or is_srvrolemember('sysadmin') = 1
...
Рейтинг: 0 / 0
25.05.2018, 13:42
    #39649890
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
война с Is_Member
invmPetrashkevich,

Правильно будет
Код: sql
1.
is_member('TestRole') = 1 or is_srvrolemember('sysadmin') = 1

эээ, этот скрипт вернёт 1, если пользователь в группе TestRole, и 0, если нет???
...
Рейтинг: 0 / 0
25.05.2018, 14:13
    #39649926
Petrashkevich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
война с Is_Member
А так ?
Код: sql
1.
2.
3.
4.
5.
6.
7.
 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
...
Рейтинг: 0 / 0
25.05.2018, 14:23
    #39649932
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
война с Is_Member
alexeyvgэээ, этот скрипт вернёт 1, если пользователь в группе TestRole, и 0, если нет???Этот скрипт проверит членство в роли, согласно модели безопасности.
PetrashkevichА так ?Не будет работать, если пользователь входит в роль опосредованно, через членчтво в другой роли.
...
Рейтинг: 0 / 0
26.05.2018, 01:36
    #39650215
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
война с Is_Member
PetrashkevichА так ?Можно посмотреть, как это делает SSMS. Профайлером.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
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

...
Рейтинг: 0 / 0
26.05.2018, 01:38
    #39650216
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
война с Is_Member
invmalexeyvgэээ, этот скрипт вернёт 1, если пользователь в группе TestRole, и 0, если нет???Этот скрипт проверит членство в роли, согласно модели безопасности.Человеку надо, как я понял, проверить, будет ли показываться пользователь в окошке свойств роли. Как на скриншоте 21439531
...
Рейтинг: 0 / 0
26.05.2018, 04:03
    #39650223
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
война с Is_Member
alexeyvgМожно посмотреть, как это делает SSMS. Профайлером.
Интересно. Согласно справке , IS_MEMBER еще и определяет членство в группе windows, и делает это по access tokens - однако в коде ни обращений к sys.login_token, ни еще куда-то.
...
Рейтинг: 0 / 0
27.05.2018, 10:20
    #39650543
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
война с Is_Member
Сон Веры ПавловныalexeyvgМожно посмотреть, как это делает SSMS. Профайлером.
Интересно. Согласно справке , IS_MEMBER еще и определяет членство в группе windows, и делает это по access tokens - однако в коде ни обращений к sys.login_token, ни еще куда-то.

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


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