2011-12-12 32 views

Trả lời

0

sử dụng fn_my_permissions

EXECUTE AS USER = 'userName'; 
SELECT * FROM fn_my_permissions(NULL, 'DATABASE') 
+0

Cảm ơn bạn @Amon nhưng tôi nghĩ rằng tôi đã không làm cho bản thân mình rõ ràng. Đầu ra của tập lệnh sẽ cho tôi danh sách các dbs, người dùng ánh xạ tới các dbs và các thành viên vai trò cơ sở dữ liệu cho mỗi người trong số họ cho một thông tin đăng nhập cụ thể. – muddu83

0

Đây có phải là loại điều bạn muốn? Bạn có thể muốn mở rộng nó để có thêm thông tin về các bảng sys.

 
use master 

DECLARE @name VARCHAR(50) -- database name 

DECLARE db_cursor CURSOR FOR 
select name from sys.databases 

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @name 

WHILE @@FETCH_STATUS = 0 
BEGIN 
     print @name 
     exec('USE ' + @name + '; select rp.name, mp.name from sys.database_role_members drm 
      join sys.database_principals rp on (drm.role_principal_id = rp.principal_id) 
      join sys.database_principals mp on (drm.member_principal_id = mp.principal_id)') 
     FETCH NEXT FROM db_cursor INTO @name 
END 

CLOSE db_cursor 
DEALLOCATE db_cursor 
+0

Cảm ơn @JDC. Tôi sợ điều đó không giúp tôi. Để được chính xác những gì tôi đang tìm là điều tương tự được gọi là 'vai trò máy chủ' và 'lập bản đồ người dùng' dưới thuộc tính đăng nhập cho một đăng nhập cụ thể. Tôi cần phải có các vai trò máy chủ liên quan và chi tiết lập bản đồ người dùng cho một thông tin đăng nhập cụ thể được liệt kê. – muddu83

32
CREATE TABLE #tempww (
    LoginName nvarchar(max), 
    DBname nvarchar(max), 
    Username nvarchar(max), 
    AliasName nvarchar(max) 
) 

INSERT INTO #tempww 
EXEC master..sp_msloginmappings 

-- display results 
SELECT * 
FROM #tempww 
ORDER BY dbname, username 

-- cleanup 
DROP TABLE #tempww 
1

Stole này từ here. Tôi tìm thấy nó rất hữu ích!

DECLARE @DB_USers TABLE 
(DBName sysname, UserName sysname, LoginType sysname, AssociatedRole varchar(max),create_date datetime,modify_date datetime) 

INSERT @DB_USers 
EXEC sp_MSforeachdb 

' 
use [?] 
SELECT ''?'' AS DB_Name, 
case prin.name when ''dbo'' then prin.name + '' (''+ (select SUSER_SNAME(owner_sid) from master.sys.databases where name =''?'') + '')'' else prin.name end AS UserName, 
prin.type_desc AS LoginType, 
isnull(USER_NAME(mem.role_principal_id),'''') AS AssociatedRole ,create_date,modify_date 
FROM sys.database_principals prin 
LEFT OUTER JOIN sys.database_role_members mem ON prin.principal_id=mem.member_principal_id 
WHERE prin.sid IS NOT NULL and prin.sid NOT IN (0x00) and 
prin.is_fixed_role <> 1 AND prin.name NOT LIKE ''##%''' 

SELECT 

dbname,username ,logintype ,create_date ,modify_date , 

STUFF(

(

SELECT ',' + CONVERT(VARCHAR(500),associatedrole) 

FROM @DB_USers user2 

WHERE 

user1.DBName=user2.DBName AND user1.UserName=user2.UserName 

FOR XML PATH('') 

) 

,1,1,'') AS Permissions_user 

FROM @DB_USers user1 

GROUP BY 

dbname,username ,logintype ,create_date ,modify_date 

ORDER BY DBName,username 
2

Tôi đã viết một truy vấn nhỏ để tìm sự cho phép của người dùng trên cơ sở dữ liệu cụ thể.

SELECT * FROM 
    (
    SELECT 
    perm.permission_name AS 'PERMISSION' 
    ,perm.state_desc AS 'RIGHT' 
    ,perm.class_desc AS 'RIGHT_ON' 
    ,p.NAME AS 'GRANTEE' 
    ,m.NAME AS 'USERNAME' 
    ,s.name AS 'SCHEMA' 
    ,o.name AS 'OBJECT' 
    ,IIF(perm.class = 0, db_name(), NULL) AS 'DATABASE' 
    FROM 
    sys.database_permissions perm 
    INNER JOIN sys.database_principals p ON p.principal_id = perm.grantee_principal_id 
    LEFT JOIN sys.database_role_members rm ON rm.role_principal_id = p.principal_id 
    LEFT JOIN sys.database_principals m ON rm.member_principal_id = m.principal_id 
    LEFT JOIN sys.schemas s ON perm.class = 3 AND perm.major_id = s.schema_id 
    LEFT JOIN sys.objects AS o ON perm.class = 1 AND perm.major_id = o.object_id 
    UNION ALL 
    SELECT 
    perm.permission_name AS 'PERMISSION' 
    ,perm.state_desc AS 'RIGHT' 
    ,perm.class_desc AS 'RIGHT_ON' 
    ,'SELF-GRANTED' AS 'GRANTEE' 
    ,p.NAME AS 'USERNAME' 
    ,s.name AS 'SCHEMA' 
    ,o.name AS 'OBJECT' 
    ,IIF(perm.class = 0, db_name(), NULL) AS 'DATABASE' 
    FROM 
    sys.database_permissions perm 
    INNER JOIN sys.database_principals p ON p.principal_id = perm.grantee_principal_id 
    LEFT JOIN sys.schemas s ON perm.class = 3 AND perm.major_id = s.schema_id 
    LEFT JOIN sys.objects AS o ON perm.class = 1 AND perm.major_id = o.object_id 
    ) AS [union] 
    WHERE [union].USERNAME = 'Username' -- Username you will search for 
    ORDER BY [union].RIGHT_ON, [union].PERMISSION, [union].GRANTEE 

Các điều khoản về vai trò cơ sở dữ liệu cố định không xuất hiện trong sys.database_permissions. Do đó, các hiệu trưởng cơ sở dữ liệu có thể có các quyền bổ sung không được liệt kê ở đây.

Tôi không thích

EXECUTE AS USER = 'userName'; 
    SELECT * FROM fn_my_permissions(NULL, 'DATABASE') 

Bởi vì nó chỉ lấy những quyền người dùng đã không phải là nơi họ đến từ!

Có lẽ tôi tìm hiểu làm thế nào để tham gia các vai trò cơ sở dữ liệu cho phép cố định cấp cho người sử dụng một ngày nào đó ...

Xin vui lòng thưởng thức cuộc sống và ghét những người sử dụng: D

2
CREATE TABLE #tempww (

    LoginName nvarchar(max), 
    DBname nvarchar(max), 
    Username nvarchar(max), 
    AliasName nvarchar(max) 
) 

INSERT INTO #tempww 

EXEC master..sp_msloginmappings 

-- display results 

declare @col varchar(1000) 

declare @sql varchar(2000) 

select @col = COALESCE(@col + ', ','') + QUOTENAME(DBname) 

from #tempww Group by DBname 

Set @sql='select * from (select LoginName,Username,AliasName,DBname,row_number() over(order by (select 0)) rn from #tempww) src 

PIVOT (Max(rn) FOR DBname 

IN ('[email protected]+')) pvt' 

EXEC(@sql) 



-- cleanup 
DROP TABLE #tempww 
+0

Số dưới một số cột cơ sở dữ liệu là gì? Khá chắc chắn đó là cơ sở dữ liệu mà Tên đăng nhập có quyền truy cập nhưng có phải là số lần đăng nhập này đã đăng nhập không? – JustJohn

Các vấn đề liên quan