Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Login and user: не вижу роли / 25 сообщений из 27, страница 1 из 2
06.09.2018, 13:03
    #39698972
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Login and user: не вижу роли
SQL Server 2012

Есть сервер логин vasya, есть юзер базы vasya, на который мэпнут серверный логин.

У юзера есть database role:
myrole
public

Вопрос: когда я для логина даю серверную роль , скажем, sysadmin, у юзера остается (в SSMS) роль myrole, а вот такой запрос, выполняемый из-под данного юзера, уже не возвращает эту роль:
Код: sql
1.
2.
3.
4.
5.
SELECT	dbo.sysusers.uid, dbo.sysusers.name,IS_MEMBER(dbo.sysusers.name) as ismemeber,
*
FROM	dbo.sysusers 
WHERE dbo.sysusers.issqlrole = 1 
AND IS_MEMBER(dbo.sysusers.name)=1




Если же убрать серверную роль сисадмина у юзера - запрос возвращает, все ок.
...
Рейтинг: 0 / 0
06.09.2018, 13:26
    #39698998
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Login and user: не вижу роли
Члены роли sysadmin сопоставлются в БД с dbo.
Так что vasya перестает быть таковым.
...
Рейтинг: 0 / 0
06.09.2018, 13:39
    #39699008
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Login and user: не вижу роли
invmЧлены роли sysadmin сопоставлются в БД с dbo.
Так что vasya перестает быть таковым.

ясно,спасибо!Если убираю серверную роль - все восстанавливается, как и хочется юзеру.

И еще, правильно ли так:
т.е. несмотря на то, что я вижу назначение дб роли для него в SSMS - запрос не выдает принадлежность васи к этой роли.
И если я буду в базе этому юзеру еще назначать всякие дброли, то эти назначения не будут иметь влияния до снятия серверной роли?
...
Рейтинг: 0 / 0
06.09.2018, 13:46
    #39699018
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Login and user: не вижу роли
256kИ если я буду в базе этому юзеру еще назначать всякие дброли, то эти назначения не будут иметь влияния до снятия серверной роли?Зависит от назначенной серверной роли или ролей.
Если в результате логин будет сопоставляться с dbo, то да.
...
Рейтинг: 0 / 0
06.09.2018, 13:52
    #39699022
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Login and user: не вижу роли
Для пользователя, у которого логин является участником роли sysadmin, роли лучше смотреть вот так:
Код: sql
1.
2.
3.
4.
5.
select roles.*
from sys.database_principals principals
join sys.database_role_members membership on membership.member_principal_id=principals.principal_id
join sys.database_principals roles on roles.principal_id=membership.role_principal_id
where principals.type='U' and principals.name='DOMAIN\Login'


ну, или просто через
Код: sql
1.
exec sp_helplogins 'DOMAIN\Login'
...
Рейтинг: 0 / 0
06.09.2018, 13:55
    #39699025
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Login and user: не вижу роли
Сон Веры ПавловныДля пользователя, у которого логин является участником роли sysadmin, роли лучше смотреть вот так:
Код: sql
1.
2.
3.
4.
5.
select roles.*
from sys.database_principals principals
join sys.database_role_members membership on membership.member_principal_id=principals.principal_id
join sys.database_principals roles on roles.principal_id=membership.role_principal_id
where principals.type='U' and principals.name='DOMAIN\Login'


ну, или просто через
Код: sql
1.
exec sp_helplogins 'DOMAIN\Login'



ясно, хотя, у меня это не доменный логин, а SQL Server-ный
...
Рейтинг: 0 / 0
06.09.2018, 13:58
    #39699028
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Login and user: не вижу роли
Сон Веры ПавловныДля пользователя, у которого логин является участником роли sysadmin, роли лучше смотреть вот так:
Код: sql
1.
2.
3.
4.
5.
select roles.*
from sys.database_principals principals
join sys.database_role_members membership on membership.member_principal_id=principals.principal_id
join sys.database_principals roles on roles.principal_id=membership.role_principal_id
where principals.type='U' and principals.name='DOMAIN\Login'


ну, или просто через
Код: sql
1.
exec sp_helplogins 'DOMAIN\Login'



в данном случае то же: при наличии у логина серверной роли сисадмин и этот запрос не показывает юзерские дб роли, как и было объяснено выше
...
Рейтинг: 0 / 0
06.09.2018, 14:14
    #39699051
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Login and user: не вижу роли
256kв данном случае то же: при наличии у логина серверной роли сисадмин и этот запрос не показывает юзерские дб роли, как и было объяснено выше
У меня всё прекрасно показывает:
Код: 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.
USE master
GO
select @@version
go
CREATE LOGIN [test_login] WITH PASSWORD=N'12345aA',
	DEFAULT_DATABASE=[master],
	DEFAULT_LANGUAGE=[us_english],
	CHECK_EXPIRATION=OFF,
	CHECK_POLICY=OFF
GO
use [stuff]
go
create user [test_login] for login [test_login]
go
create role [test_role];
exec sp_addrolemember 'test_role', 'test_login';
go
print('without sysadmin:');
select roles.name
from sys.database_principals principals
join sys.database_role_members membership on membership.member_principal_id=principals.principal_id
join sys.database_principals roles on roles.principal_id=membership.role_principal_id
where principals.type='S' and principals.name='test_login';
go
exec sp_addsrvrolemember 'test_login', 'sysadmin';  
go
print('with sysadmin:');
select roles.name
from sys.database_principals principals
join sys.database_role_members membership on membership.member_principal_id=principals.principal_id
join sys.database_principals roles on roles.principal_id=membership.role_principal_id
where principals.type='S' and principals.name='test_login';
go
exec sp_droprolemember 'test_role', 'test_login';
drop role [test_role];
drop user [test_login];
use master
go
drop login [test_login];
go


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
----------------------------------------------------------------------------------
Microsoft SQL Server 2014 (SP2-CU12) (KB4130489) - 12.0.5589.7 (X64) 
	Jun  9 2018 11:17:15 
	Copyright (c) Microsoft Corporation
	Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)


(1 row(s) affected)

without sysadmin:
name
-----------------
test_role

(1 row(s) affected)

with sysadmin:
name
-----------------
test_role

(1 row(s) affected)
...
Рейтинг: 0 / 0
06.09.2018, 14:29
    #39699070
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Login and user: не вижу роли
256kв данном случае то же: при наличии у логина серверной роли сисадмин и этот запрос не показывает юзерские дб роли, как и было объяснено вышеВы же для текущего юзера пытаетесь, поэтому и не показывает.
Если логин всегда совпадает с юзером, перепишите так:
Код: sql
1.
2.
3.
4.
5.
select roles.*
from sys.database_principals principals
join sys.database_role_members membership on membership.member_principal_id=principals.principal_id
join sys.database_principals roles on roles.principal_id=membership.role_principal_id
where principals.type='U' and principals.name=system_user
...
Рейтинг: 0 / 0
06.09.2018, 15:14
    #39699105
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Login and user: не вижу роли
invm256kв данном случае то же: при наличии у логина серверной роли сисадмин и этот запрос не показывает юзерские дб роли, как и было объяснено вышеВы же для текущего юзера пытаетесь, поэтому и не показывает.
Если логин всегда совпадает с юзером, перепишите так:
Код: sql
1.
2.
3.
4.
5.
select roles.*
from sys.database_principals principals
join sys.database_role_members membership on membership.member_principal_id=principals.principal_id
join sys.database_principals roles on roles.principal_id=membership.role_principal_id
where principals.type='U' and principals.name=system_user


в частности - да,совпадает, но использоваться запрос будет для текущего юзера.

Так сработал, т.е. получается, что никуда юзерские роли не деваются при назначении логину севреной роли сисадмин?
...
Рейтинг: 0 / 0
06.09.2018, 15:20
    #39699108
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Login and user: не вижу роли
256kт.е. получается, что никуда юзерские роли не деваются при назначении логину севреной роли сисадмин?
Куда ж им деться, если при исключении логина из sysadmin они вновь появляются. Не восстанавливаются же они ниоткуда.
Что же до проверки на вхождение в роль с помощью IS_MEMBER для участника 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
13.09.2018, 11:55
    #39701973
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Login and user: не вижу роли
Поскольку SSMS показывает датабазе роли юзера правильно, даже если его логин имеет серверную роль sysadmin - пытаюсь выловить в профайлере запрос, который выполняется SSMS.

Но не могу поймать именно тот запрос, который показывает принадлежность юзера базы к списку ролей

SSMS->сервер->Databases->mybase->Security->Users->myuser->rightclick->Properties->Membership
...
Рейтинг: 0 / 0
13.09.2018, 12:05
    #39701987
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Login and user: не вижу роли
И чем приведенный выше запрос с использованием sys.database_role_members не устраивает?
...
Рейтинг: 0 / 0
13.09.2018, 12:05
    #39701988
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Login and user: не вижу роли
256kПоскольку SSMS показывает датабазе роли юзера правильно, даже если его логин имеет серверную роль sysadmin - пытаюсь выловить в профайлере запрос, который выполняется SSMS.

Но не могу поймать именно тот запрос, который показывает принадлежность юзера базы к списку ролей

SSMS->сервер->Databases->mybase->Security->Users->myuser->rightclick->Properties->Membership

Код: sql
1.
exec sp_helprolemember 
...
Рейтинг: 0 / 0
13.09.2018, 12:12
    #39701993
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Login and user: не вижу роли
Сон Веры ПавловныИ чем приведенный выше запрос с использованием sys.database_role_members не устраивает?

да вроде устраивает, но хотел понять как студия это делает, но не увидел, а результат в Properties->Membership правильный
...
Рейтинг: 0 / 0
13.09.2018, 12:13
    #39701995
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Login and user: не вижу роли
256kСон Веры ПавловныИ чем приведенный выше запрос с использованием sys.database_role_members не устраивает?

да вроде устраивает, но хотел понять как студия это делает, но не увидел, а результат в Properties->Membership правильный
профайлер запретили?
...
Рейтинг: 0 / 0
13.09.2018, 12:13
    #39701996
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Login and user: не вижу роли
256kСон Веры ПавловныИ чем приведенный выше запрос с использованием sys.database_role_members не устраивает?

да вроде устраивает, но хотел понять как студия это делает, но не увидел, а результат в Properties->Membership правильныйПрофайлером посмотрите.
...
Рейтинг: 0 / 0
13.09.2018, 12:20
    #39702003
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Login and user: не вижу роли
Сон Веры ПавловныИ чем приведенный выше запрос с использованием sys.database_role_members не устраивает?

кстати, как использовать ваш запрос, если это, например, во вью, и я знаю юзера базы, а не его логин?
...
Рейтинг: 0 / 0
13.09.2018, 12:25
    #39702010
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Login and user: не вижу роли
TaPaK256kпропущено...


да вроде устраивает, но хотел понять как студия это делает, но не увидел, а результат в Properties->Membership правильный
профайлер запретили?

тремя постами выше я написал, что ловлю запросы профайлером
...
Рейтинг: 0 / 0
13.09.2018, 12:26
    #39702014
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Login and user: не вижу роли
alexeyvg256kпропущено...


да вроде устраивает, но хотел понять как студия это делает, но не увидел, а результат в Properties->Membership правильныйПрофайлером посмотрите.

выше я так написал:
"Поскольку SSMS показывает датабазе роли юзера правильно, даже если его логин имеет серверную роль sysadmin - пытаюсь выловить в профайлере запрос , который выполняется SSMS.

Но не могу поймать именно тот запрос, который показывает принадлежность юзера базы к списку ролей

SSMS->сервер->Databases->mybase->Security->Users->myuser->rightclick->Properties->Membership"
...
Рейтинг: 0 / 0
13.09.2018, 14:05
    #39702098
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Login and user: не вижу роли
256kкстати, как использовать ваш запрос, если это, например, во вью, и я знаю юзера базы, а не его логин?
Ну, вообще sys.database_principals - это именно пользователи базы, а не логины. И поле name содержит именно имя пользователя, а не имя логина.
...
Рейтинг: 0 / 0
13.09.2018, 14:37
    #39702134
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Login and user: не вижу роли
Сон Веры Павловны256kкстати, как использовать ваш запрос, если это, например, во вью, и я знаю юзера базы, а не его логин?
Ну, вообще sys.database_principals - это именно пользователи базы, а не логины. И поле name содержит именно имя пользователя, а не имя логина.

да, протормозил
...
Рейтинг: 0 / 0
13.09.2018, 14:40
    #39702137
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Login and user: не вижу роли
256kНо не могу поймать именно тот запрос, который показывает принадлежность юзера базы к списку ролей

SSMS->сервер->Databases->mybase->Security->Users->myuser->rightclick->Properties->Membership"Кроме этих запросов, студии неоткуда взять "принадлежность юзера базы к списку ролей"
Так что просто внимательно смотрите.
Выполняйте их, смотрите, что возвращают.
...
Рейтинг: 0 / 0
13.09.2018, 14:47
    #39702146
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Login and user: не вижу роли
alexeyvg256kНо не могу поймать именно тот запрос, который показывает принадлежность юзера базы к списку ролей

SSMS->сервер->Databases->mybase->Security->Users->myuser->rightclick->Properties->Membership"Кроме этих запросов, студии неоткуда взять "принадлежность юзера базы к списку ролей"
Так что просто внимательно смотрите.
Выполняйте их, смотрите, что возвращают.

да, конечно, что-то выполняется, но я,собственно, потому и спросил, что не нашел.
Профайлером выловил от старта студии до уже показанной формы Проперти.
...
Рейтинг: 0 / 0
13.09.2018, 17:48
    #39702286
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Login and user: не вижу роли
256kда, конечно, что-то выполняется, но я,собственно, потому и спросил, что не нашел.
Профайлером выловил от старта студии до уже показанной формы Проперти.Студия сначала читает все роли из sys.database_principals, а потом для каждой (в цикле) проверяет соответствие батчем:
Код: 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.
50.
51.
52.
53.
54.
55.
56.
57.
exec sp_executesql 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
''Server[@Name='' + quotename(CAST(
        serverproperty(N''Servername'')
       AS sysname),'''''''') + '']'' + ''/Database[@Name='' + quotename(db_name(),'''''''') + '']'' + ''/'' + (CASE u.type 
				WHEN ''A'' THEN N''ApplicationRole''
				WHEN ''R'' THEN N''Role''
				ELSE N''User'' END)
			+ ''[@Name='' + quotename(u.name,'''''''') + '']'' AS [Urn],
u.name AS [Name],
u.principal_id AS [ID],
suser_sname(u.sid) AS [Login]
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
(u.name=@_msparam_2)and((rl.type = ''R'')and(rl.name=@_msparam_3))

			drop table #tmp_role_member_ids
		
',N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000),@_msparam_2 nvarchar(4000),@_msparam_3 nvarchar(4000)',@_msparam_0=N'testRole',@_msparam_1=N'testRole',@_msparam_2=N'testUser',@_msparam_3=N'testRole'


Внутри батча используется, например, database_role_members
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Login and user: не вижу роли / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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