2

我正在尝试获取数据库级别的特定用户的所有表及其权限的列表,例如:

User Name    DBName    TableName    Type of Access
=========    ======    =========    ==============
...          ...       ...          ...

我试过用...

EXEC sp_helprolemember
EXEC sp_helprotect 

...和其他人,但他们并没有真正帮助我。

我也尝试过使用sp_msloginmappings,但这失败了,因为我在服务器上没有管理员权限。

请给我一些建议或例子。

4

2 回答 2

1

我不是 T-SQL 方面的专家,但是,这可能会满足您的期望。

declare @Proc nvarchar(50)
declare @RowCnt int
declare @MaxRows int
declare @ExecSql nvarchar(255)

select @RowCnt = 1
select @Proc = 'SELECT * from fn_my_permissions'

declare @Import table (rownum int IDENTITY (1, 1) Primary key NOT NULL , TableName varchar(50))
insert into @Import (TableName) select name from sys.Tables

declare @Output table (entity_name varchar(50), subentity_name varchar(50), permission_name varchar(50))

select @MaxRows=count(*) from @Import

while @RowCnt <= @MaxRows
begin
    select @ExecSql = @Proc + '(N''' + TableName + ''', N''OBJECT'') where subentity_name = ''''' from @Import where rownum = @RowCnt 
    insert into @Output exec sp_executesql @ExecSql
    Select @RowCnt = @RowCnt + 1
end

select * from @Output

这将为当前用户提供权限。如果您想查找给定用户的权限,请尝试以下操作;

EXECUTE AS LOGIN = N'username'
GO

declare @Proc nvarchar(50)
declare @RowCnt int
declare @MaxRows int
declare @ExecSql nvarchar(255)

select @RowCnt = 1

select @Proc = 'SELECT * from fn_my_permissions'

declare @Import table (rownum int IDENTITY (1, 1) Primary key NOT NULL , TableName varchar(50))
insert into @Import (TableName) select name from sys.Tables

declare @Output table (entity_name varchar(50), subentity_name varchar(50), permission_name varchar(50))

select @MaxRows=count(*) from @Import

while @RowCnt <= @MaxRows
begin

    select @ExecSql = @Proc + '(N''' + TableName + ''', N''OBJECT'') where subentity_name = ''''' from @Import where rownum = @RowCnt 
    insert into @Output exec sp_executesql @ExecSql

    Select @RowCnt = @RowCnt + 1
end

select * from @Output

GO

REVERT
GO

当然,只需将用户名替换为您需要获取权限的用户的登录名即可。

您还必须指定要为哪个数据库执行此操作。

我已将结果限制在表格本身。但是,如果您删除;

where subentity_name = '''''

您还可以找到每个列的权限。

我确信必须有更好的方法来做到这一点......但是,这似乎无论如何都有效!

于 2013-01-18T23:23:40.620 回答
0

这在过去对我有用,告诉我他们可以访问什么以及什么样的访问权限

select princ.name
, princ.type_desc
, perm.permission_name
, perm.state_desc
, perm.class_desc
, object_name(perm.major_id)
from sys.database_principals princ
left join
sys.database_permissions perm
on perm.grantee_principal_id = princ.principal_id
WHERE princ.name = 'USERNAME'
于 2013-01-18T23:44:59.230 回答