список пользователей и ролей, имеющих разрешения на объект (таблицу) в SQL - PullRequest
16 голосов
/ 12 мая 2011

Вы могли бы подумать, что я смогу Google такой простой вопрос.Но что бы я ни пытался, я попал в кирпичную стену.

Что такое оператор TSQL, чтобы найти список ролей, имеющих разрешения для таблицы?

Псевдокод выглядит так:

SELECT role_name 
FROM permissions 
where object_name = 'the_table_i_need_to_know_about'

Ответы [ 3 ]

26 голосов
/ 16 мая 2011

Это немного сложно.Во-первых, помните, что встроенные роли имеют предопределенный доступ;они не будут отображаться в запросе ниже.В предложенном запросе перечислены настраиваемые роли базы данных и доступ к которым им был специально предоставлен или запрещен.Это то, что вы искали?

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
7 голосов
/ 12 мая 2011

Попробуйте это,

sp_helprotect "имя таблицы" go

2 голосов
/ 06 июня 2016

Чтобы получить отдельные роли, назначенные конкретному пользователю в базе данных, необходимо выполнить процедуру 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 

...