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

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

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


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

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

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

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

эээ, этот скрипт вернёт 1, если пользователь в группе TestRole, и 0, если нет???
...
Рейтинг: 0 / 0
война с Is_Member
    #39649926
Petrashkevich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А так ?
Код: 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
война с Is_Member
    #39649932
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgэээ, этот скрипт вернёт 1, если пользователь в группе TestRole, и 0, если нет???Этот скрипт проверит членство в роли, согласно модели безопасности.
PetrashkevichА так ?Не будет работать, если пользователь входит в роль опосредованно, через членчтво в другой роли.
...
Рейтинг: 0 / 0
война с Is_Member
    #39650215
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
война с Is_Member
    #39650216
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmalexeyvgэээ, этот скрипт вернёт 1, если пользователь в группе TestRole, и 0, если нет???Этот скрипт проверит членство в роли, согласно модели безопасности.Человеку надо, как я понял, проверить, будет ли показываться пользователь в окошке свойств роли. Как на скриншоте 21439531
...
Рейтинг: 0 / 0
война с Is_Member
    #39650223
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgМожно посмотреть, как это делает SSMS. Профайлером.
Интересно. Согласно справке , IS_MEMBER еще и определяет членство в группе windows, и делает это по access tokens - однако в коде ни обращений к sys.login_token, ни еще куда-то.
...
Рейтинг: 0 / 0
война с Is_Member
    #39650543
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныalexeyvgМожно посмотреть, как это делает SSMS. Профайлером.
Интересно. Согласно справке , IS_MEMBER еще и определяет членство в группе windows, и делает это по access tokens - однако в коде ни обращений к sys.login_token, ни еще куда-то.

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


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