Список пользователей и роли, которые имеют разрешения на объект (таблицу) в 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