2013-01-18 24 views
2

我想獲得的所有表的列表,並在數據庫級別的特定用戶對他們的權利,如:名單表,訪問類型的特定數據庫用戶

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

我曾嘗試使用...

EXEC sp_helprolemember 
EXEC sp_helprotect 

...和其他人,但他們並沒有真正幫助我。

我也嘗試過使用sp_msloginmappings,但是這樣做失敗了,因爲我沒有在服務器上的管理員權限。

請給我一些指點或例子。

+0

@ AB的....感謝編輯,使之更加清晰。 –

回答

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

@Gallagher .....這就是我所期待的......感謝這個例子..... Ur一個T-SQL專家....再次感謝 –

+0

感謝您的讚美S!太好了,我可以幫忙! – PGallagher

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' 
相關問題