我试图在数据库级别为特定用户获取所有表及其权限的列表,例如:
User Name DBName TableName Type of Access
========= ====== ========= ==============
... ... ... ...
我尝试过使用...
EXEC sp_helprolemember
EXEC sp_helprotect
......和其他人,但他们并没有真正帮助我。
我也尝试使用sp_msloginmappings
,但由于我在服务器上没有管理员权限,因此失败了。
请给我一些指示或示例。
答案 0 :(得分: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
当然,只需将username替换为获取权限所需用户的登录名。
您还必须指定要为其执行此操作的数据库。
我已将结果限制在表格本身。但是,如果删除;
where subentity_name = '''''
您也可以找到每列的权限。
我确信必须有更好的方法来做到这一点......但是,无论如何这似乎都有效!
答案 1 :(得分: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'