powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / v_my_permissions
11 сообщений из 11, страница 1 из 1
v_my_permissions
    #39962288
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Панадобилось дать пользователям обзор, какими правами на какие объекты они располагают.
Был бы благодарен за критику / исправления.

Код: 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.
create view [dbo].[v_my_permissions]
as
 

WITH Q0 as
(
SELECT T.TABLE_TYPE AS OBJECT_TYPE, T.TABLE_SCHEMA AS [SCHEMA_NAME], T.TABLE_NAME AS [OBJECT_NAME], P.PERMISSION_NAME 
    FROM INFORMATION_SCHEMA.TABLES T
    CROSS APPLY fn_my_permissions(T.TABLE_SCHEMA + '.' + T.TABLE_NAME, 'OBJECT') P
    WHERE P.subentity_name = ''
UNION
SELECT R.ROUTINE_TYPE AS OBJECT_TYPE, R.ROUTINE_SCHEMA AS [SCHEMA_NAME], R.ROUTINE_NAME AS [OBJECT_NAME], P.PERMISSION_NAME
    FROM INFORMATION_SCHEMA.ROUTINES R
    CROSS APPLY fn_my_permissions(R.ROUTINE_SCHEMA + '.' + R.ROUTINE_NAME, 'OBJECT') P
	where R.ROUTINE_NAME not in('fn_diagramobjects','sp_alterdiagram','sp_creatediagram','sp_dropdiagram','sp_helpdiagramdefinition','sp_helpdiagrams','sp_renamediagram')
)
,Q2 as
(
SELECT DISTINCT
 OBJECT_TYPE
,SCHEMA_NAME
,OBJECT_NAME
,substring((select '; ' + PERMISSION_NAME from Q0 b WHERE a.OBJECT_NAME=b.OBJECT_NAME and a.OBJECT_TYPE=b.OBJECT_TYPE and a.SCHEMA_NAME=b.SCHEMA_NAME order by b.permission_name for XML path('')),2,1000) PERMISSIONS
from Q0 a
)
select top 100000 * from Q2
where PERMISSIONS <> ' VIEW DEFINITION'
order by SCHEMA_NAME, OBJECT_NAME
GO

--идея: http://dbadailystuff.com/2012/08/20/get-sql-server-user-permissions


...
Рейтинг: 0 / 0
v_my_permissions
    #39962304
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Us,

а чем вам просто использование sys.fn_my_permissions не угодило?

просто если вам нужен именно список, то нельзя сказать что тот запрос что у вас сейчас есть покажет полную картину
...
Рейтинг: 0 / 0
v_my_permissions
    #39962313
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff,

Да, мне нужно чтобы пользователь одним запросом получал перечень объектов текущей базы
как таблицы, виды, процедуры, функции (кроме столбцов) с перечислением дозволенных действий.
...
Рейтинг: 0 / 0
v_my_permissions
    #39962317
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Специфические для MSSQL вещи проще делать через системные таблицы и представления.
Код: sql
1.
2.
3.
4.
5.
6.
select
 so.object_id, o.name, so.type_desc, stuff(p.x.value('.', 'nvarchar(max)'), 1, 2, '')
from
 sys.objects so cross apply
 (select quotename(schema_name(so.schema_id)) + N'.' + quotename(name)) o(name) cross apply
 (select distinct ', '  + permission_name from sys.fn_my_permissions(o.name, 'object') for xml path(''), type) p(x);
...
Рейтинг: 0 / 0
v_my_permissions
    #39962345
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Спасибо, красивое решение.
...
Рейтинг: 0 / 0
v_my_permissions
    #39962349
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Us,

а вам нужно только персонализированное право?

просто представьте ситуацию что пользователь имеет право impersonate на более привелигированную учетку.

в таком случае к примеру fn_my_permissions не покажет прямых прав на допустим таблицу, а вот косвенные права при олицетворении у пользователя фактически будут.
это попадает под ваше определение "объектов текущей базы как таблицы, виды, процедуры, функции (кроме столбцов) с перечислением дозволенных действий."?
...
Рейтинг: 0 / 0
v_my_permissions
    #39962356
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Us,

Пользователь может также иметь разрешения уровня базы данных, быть членом роли, владельцем схемы.
...
Рейтинг: 0 / 0
v_my_permissions
    #39962367
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
Alexander Us,

а вам нужно только персонализированное право?

просто представьте ситуацию что пользователь имеет право impersonate на более привелигированную учетку.

в таком случае к примеру fn_my_permissions не покажет прямых прав на допустим таблицу, а вот косвенные права при олицетворении у пользователя фактически будут.
это попадает под ваше определение "объектов текущей базы как таблицы, виды, процедуры, функции (кроме столбцов) с перечислением дозволенных действий."?


- мне нужны "эффективные" права.
неважно как позьзователь получил право - в составе группы или персоонально, ему надо выдать строчку
объект ; права

- до сих пор impersonate использовалось только свеху вниз. например, руководитель группы / или админ смотрит, что мам можно делать Васе Пупкину.
...
Рейтинг: 0 / 0
v_my_permissions
    #39962375
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Alexander Us,

Пользователь может также иметь разрешения уровня базы данных, быть членом роли, владельцем схемы.


Неважно как позьзователь получил право - в составе группы, персоонально и т.д., ему надо выдать строчку
объект ; права

Т.е. но мне нужны "эффективные" права чтобы, например
- разработчик мог быстпо посмотреть есть ли у него необходимые права на объект(ы)
- руководитель группы или админ мог убедиться в наличии (отсутствии) прав пользователя на объект(ы)

В этом случае не играет роли как эти права получены.
...
Рейтинг: 0 / 0
v_my_permissions
    #39962394
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Us,

ну мы же вашей инфраструктуры не знаем, пользователи могут кстати сами права выдавать.

в целом может получиться вот такая ситуация

Код: 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.
create user u1 without login;
create user u2 without login;

create table tu1 (id int);
alter authorization on tu1 to u1;
insert into tu1 values (1), (2), (3);

execute as user = 'u1';
select * from tu1;
revert;

execute as user = 'u2';
select * from tu1;
revert;

execute as user = 'u1';
grant impersonate on user::u1 to u2; 
revert;

execute as user = 'u2';
execute as user = 'u1';
select user_name(), * from tu1;
revert;
revert;

или

execute as user = 'u1';
grant take ownership on tu1 to u2
revert;

execute as user = 'u2';
alter authorization on tu1 to u2
select * from tu1
revert



как бы пользователь u2 изначально прав на таблицу не имеет, но стоит у него появиться некоторой лазейке и пожалуйста.
...
Рейтинг: 0 / 0
v_my_permissions
    #39962695
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff,

спасибо за замечательный ! пример.

Но в реальной жизни мой запрос/вид нужны для добросовестных пользователей, чтобы можно было быстро оценить, на какие объекты есть или не хватает прав.

По крайней мере в одном из двух, продемонстированных Вами случаев запрос от invm выдаст стоку с "TAKE OWNERSHIP" для пользователя "u2", таблицы "tu1".
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / v_my_permissions
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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