Список пользователей и роли, которые имеют разрешения на объект (таблицу) в SQL
Вы бы подумали, что я могу ответить на такой простой вопрос Google. Но независимо от того, что я пытаюсь, я ударил кирпичную стену.
Что такое оператор TSQL для поиска списка ролей, имеющих разрешения для таблицы?
Псевдокод выглядит следующим образом:
SELECT role_name
FROM permissions
where object_name = 'the_table_i_need_to_know_about'
Ответы
Ответ 1
Это немного сложно. Во-первых, помните, что встроенные роли имеют предопределенный доступ; они не будут отображаться в запросе ниже. В предлагаемом запросе перечислены роли пользовательской базы данных и доступ к которым они были специально предоставлены или отклонены. Это то, что вы искали?
select permission_name, state_desc, type_desc, U.name, OBJECT_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
Ответ 2
Попробуйте это,
sp_helprotect "имя таблицы"
идти
Ответ 3
Чтобы получить отдельные роли, назначенные конкретному пользователю в базе данных, вам необходимо выполнить процедуру sp_helpusers. Следующая процедура выполнит sp_helpuser для каждой базы данных на сервере, скопирует результаты для каждой базы данных в переменной таблицы и затем предоставит результирующий набор каждой базы данных, пользователя и роли, на которую у них есть разрешение:
Create Procedure dba_HelpUserRoles
AS
Declare @SQL Varchar(2000)
Declare @DBname Sysname
Declare @HelpUserResults Table
(
UserName Sysname,
RoleName Sysname,
LoginName Sysname NULL,
DefDBName Sysname NULL,
DefSchemaName Sysname NULL,
UserID Smallint,
SID Smallint
)
Declare @DbUserResults Table
(
DBname Sysname,
UserName Sysname,
RoleName Sysname,
LoginName Sysname NULL,
DefDBName Sysname NULL,
DefSchemaName Sysname NULL,
UserID Smallint,
SID Smallint
)
Declare @DBcursor
Cursor For
Select Name
From sys.sysdatabases
Order by Name;
Fetch Next
From DBcursor
Into @DBname;
While @@Fetch_Status = 0
Begin
Set @SQL = 'Use [' + @DBname + ']; Exec sp_helpuser;';
Print @SQL
Insert @HelpUserResults
Exec(@SQL);
Insert @DBUserReults
Select @DBname, *
From @HelpUserResults
Where LoginName IS NOT NULL;
Delete
From HelpUserResults;
Fetch Next
From DBcursor
Into @DBname;
End
Close DBcursor;
Deallocate DBcursor;
Select *
From @DBUser_Results;
-------------------------------- Procedure End