我不是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 = '''''
您還可以找到每個列的權限。
我相信這樣做肯定有更好的方法......但是,這似乎工作無論如何!
@ AB的....感謝編輯,使之更加清晰。 –