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 に答える