| Начало » Использование СУБД » Microsoft SQL Server » Выборка ролей с их свойствами из инстанса (Окажите помощь в доработке скрипта) Переход к форуму:
	| 
		
			| Выборка ролей с их свойствами из инстанса [сообщение #5632] | Tue, 29 October 2024 11:48  |  
			| 
				
				
					|  keepermode Сообщений: 37
 Зарегистрирован: May 2023
 | Member |  |  |  
	| Как сделать выборку из инстанса (описание ролей в базах): Список баз, роль в базе, информация из свойств роли (см.скрин) - Schema, Name, Type - и по каждой строчке выбранные Permitions (например Select - Grant и т.д.)
 Grantor, Grant, With Grant, Deny
 
 
 1. Первые три колонки работают по скрипту:
 EXEC sp_msforeachdb 'USE [?];
 --Исключаем системные базы
 IF DB_NAME() NOT IN (''master'', ''model'', ''msdb'', ''tempdb'')
 SELECT DB_NAME() AS [DB_NAME],  RP.name AS [Role_NAME],  UP.default_schema_name AS [User_Schema] --, --sys.schemas
 FROM sys.database_role_members AS R
 INNER JOIN sys.database_principals AS UP
 ON UP.principal_id = R.member_principal_id
 INNER JOIN sys.database_principals AS RP
 ON RP.principal_id = R.role_principal_id
 ORDER BY RP.name, UP.name
 '
 GO
 
 
 2. --Выборка table_name, table_type, TABLE_SCHEMA работает:
 SELECT table_name, table_type, TABLE_SCHEMA
 FROM information_schema.table
 
 3. --Выборку уникальных Permision вот нашёл:
 select DISTINCT permission_name from sys.database_permissions
 
 -- alter,  control, Permission, Delete,  Insert, References, Select, Update, Take owneship, Vew change tracking, Vew definition
 ---------------------
 
 
 Как это слепить/объединить, чтобы показало всё вместе? Сопоставить Базы Роли Схемы Таблицы ТипыТаблиц Permissions
 [Обновления: Tue, 29 October 2024 16:38] Известить модератора |  
	|  |  |  
	|  |  
	|  |  
	| 
		
			| Re: Выборка ролей с их свойствами из инстанса [сообщение #5648 является ответом на сообщение #5637] | Thu, 31 October 2024 11:28   |  
			| 
				
				
					|  BlackEric Сообщений: 393
 Зарегистрирован: June 2022
 | Senior Member |  |  |  
	| 
Declare @T Table ([DB_NAME] nvarchar(128), [Role_NAME] nvarchar(128), [User_Schema] nvarchar(128))
Insert @T
EXEC sp_msforeachdb 'USE [?];
--Исключаем системные базы
IF DB_NAME() NOT IN (''master'', ''model'', ''msdb'', ''tempdb'')
    SELECT DB_NAME() AS [DB_NAME],  RP.name AS [Role_NAME],  UP.default_schema_name AS [User_Schema] --, --sys.schemas
   FROM sys.database_role_members AS R
   INNER JOIN sys.database_principals AS UP
       ON UP.principal_id = R.member_principal_id
   INNER JOIN sys.database_principals AS RP
       ON RP.principal_id = R.role_principal_id
   ORDER BY RP.name, UP.name
'
Select * from @T t
left join 
 information_schema.TABLES ist
on t.User_Schema = ist.TABLE_SCHEMA
GO
 |  
	|  |  |  
	| 
		
			| Re: Выборка ролей с их свойствами из инстанса [сообщение #5651 является ответом на сообщение #5648] | Thu, 31 October 2024 14:12   |  
			| 
				
				
					|  keepermode Сообщений: 37
 Зарегистрирован: May 2023
 | Member |  |  |  
	| Огромное спасибо! Можно теперь сюда как то привязать Permissions?
 
 
 -- Уникальные Permissions(разрешения):select permission_name, T.name AS Table_name, state_desc, type_desc, U.name,  major_id from sys.database_permissions P join  sys.tables T ON P.major_id = T.object_id join  sysusers U ON U.uid = P.grantee_principal_id
 --Список рermission (разрешений) инстанса, имеющих права доступа к определённой таблицеselect DISTINCT permission_name from sys.database_permissions
 select permission_name, T.name AS Table_name, state_desc, type_desc, U.name,  major_id from sys.database_permissions P join  sys.tables T ON P.major_id = T.object_id join  sysusers U ON U.uid = P.grantee_principal_id[Обновления: Thu, 31 October 2024 14:46] Известить модератора |  
	|  |  |  
	|  |  
	|  |  
	| 
		
			| Re: Выборка ролей с их свойствами из инстанса [сообщение #5682 является ответом на сообщение #5662] | Sat, 02 November 2024 16:35   |  
			| 
				
				
					|  BlackEric Сообщений: 393
 Зарегистрирован: June 2022
 | Senior Member |  |  |  
	| Возможно так, но я не проверял детально. Мог где-то что-то не поджойнить.
Declare @Tt Table ([DB_NAME] nvarchar(128), [Role_NAME] nvarchar(128), [User_Schema] nvarchar(128), [User_Schema_Id] int)
Insert @Tt
EXEC sp_msforeachdb 'USE [?];
--Исключаем системные базы
IF DB_NAME() NOT IN (''master'', ''model'', ''msdb'', ''tempdb'')
    SELECT DB_NAME() AS [DB_NAME],  UP.name AS [Role_NAME],  UP.default_schema_name AS [User_Schema], sc.schema_id
   FROM sys.database_role_members AS R
	INNER JOIN sys.database_principals AS UP
       ON UP.principal_id = R.member_principal_id
	Left JOIN sys.schemas sc
		on UP.default_schema_name = sc.[name]
   ORDER BY UP.name
'
Select tt.DB_NAME, tt.Role_NAME, tt.User_Schema, tt.User_Schema_Id, P.permission_name, T.name AS Table_name, P.state_desc, T.type_desc, U.name,  P.major_id  from @Tt tt
left join sys.TABLES st
	on tt.User_Schema_Id = st.schema_id
join sys.database_permissions P
	on p.major_id = st.object_id
join  sys.tables T 
	ON P.major_id = T.object_id 
join  sysusers U 
	ON U.uid = P.grantee_principal_id
GO
 |  
	|  |  |  
	|  | 
 
 
 Текущее время: Fri Oct 31 18:13:35 GMT+3 2025 
 Общее время, затраченное на создание страницы: 0.00720 секунд |