web-dev-qa-db-ja.com

ログインのデータベースロール/権限を持つすべてのユーザーマッピングを一覧表示するT-SQL

データベースと、特定のユーザーにマップされたそれぞれのロール/特権をリストできるt-sqlスクリプトを探しています。 SQL Server 2008 R2を使用します。

16
muddu83
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
35
Walter Wildoer
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 ('+@col+')) pvt'

EXEC(@sql)



-- cleanup
DROP TABLE #tempww
3
Piotr Czekaj

特定のデータベースのユーザーの許可を見つけるための小さなクエリを作成しました。

    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

固定データベースロールのアクセス許可はsys.database_permissionsに表示されません。したがって、データベースプリンシパルには、ここにリストされていない追加のアクセス許可がある場合があります。

私は好まない

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

なぜなら、ユーザーがどこから来たのではなく、どのパーミッションを持っているかを取得しているからです!

たぶん、ユーザーに付与された固定データベースロールのアクセス許可に参加する方法を見つけました...

Plsは生命を楽しみ、ユーザーを憎みます:D

2
Spektakulatius

これを here から盗みました。とても便利だと思いました!

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
1
sam yi

fn_my_permissions を使用して

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

これを並べ替えましたか?私はここでこのコードを見つけました:

http://www.pythian.com/news/29665/httpconsultingblogs-emc-comjamiethomsonarchive20070209sql-server-2005_3a00_-view-all-permissions-_2800_2_2900_-aspx/

私は少し調整する必要があると思いますが、本質的にはこれが私のためにそれをソートしました!

皆さんにも役立つことを願っています!

J

0
JYatesDBA

これはあなたが望む種類のものですか? sysテーブルからより多くの情報を取得するために拡張することもできます。

 use master 
 
 DECLARE @name VARCHAR(50)-データベース名
 
 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)
 sys.database_principals mpに参加(drm.member_principal_id = mp.principal_id) ')
 FETCH NEXT FROM db_cursor INTO @name 
 END 
 END ] 
 CLOSE db_cursor 
 DEALLOCATE db_cursor 
0
JDC