私は 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 = '''''
各列の権限も確認できます。
これを行うためのより良い方法があるに違いないと確信しています...しかし、これはとにかくうまくいくようです!