19

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

4

7 に答える 7

38
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
于 2012-02-20T05:48:22.897 に答える
4
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
于 2015-11-19T14:40:19.337 に答える
2

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

    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

于 2014-10-16T08:47:09.330 に答える
0

fn_my_permissionsを使用する

EXECUTE AS USER = 'userName';
SELECT * FROM fn_my_permissions(NULL, 'DATABASE') 
于 2011-12-12T07:33:54.327 に答える
0

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

マスターを使用

DECLARE @name VARCHAR(50)-データベース名

db_cursorCURSORFORを宣言します
sys.databasesから名前を選択します

OPEN db_cursor  
次のデータベースをdb_cursorから@nameにフェッチ  

WHILE @@ FETCH_STATUS = 0  
始める  
       名前を印刷する
      exec('USE' + @name +'; sys.database_role_members drmからrp.name、mp.nameを選択します
            sys.database_principals rp on(drm.role_principal_id = rp.principal_id)に参加します
            sys.database_principals mp on(drm.member_principal_id = mp.principal_id)')に参加します
       次のデータベースをdb_cursorから@nameにフェッチ  
終わり  

db_cursorを閉じる  
DEALLOCATE db_cursor
于 2011-12-12T07:46:20.963 に答える
0

これ並べた?ここでこのコードを見つけました:

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

少し微調整する必要があると思いますが、基本的にはこれでうまくいきました。

あなたにも当てはまることを願っています!

J

于 2012-05-23T14:22:12.170 に答える