2016-06-17 22 views
2

データベースユーザーとそのSQL Serverに対するアクセス許可を示すレポートを入手する必要があります。以下は、仕事をするクエリです。データベースユーザーのリストとSQL Serverの権限を取得する

WITH CTE AS 
(
SELECT 
[UserName] = CASE princ.[type] 
       WHEN 'S' THEN princ.[name] 
       WHEN 'U' THEN ulogin.[name] COLLATE Latin1_General_CI_AI 
      END, 
[UserType] = CASE princ.[type] 
       WHEN 'S' THEN 'SQL User' 
       WHEN 'U' THEN 'Windows User' 
      END, 
[DatabaseUserName] = princ.[name],  
[Role] = null,  
[PermissionType] = perm.[permission_name],  
[PermissionState] = perm.[state_desc],  
[ObjectType] = obj.type_desc,--perm.[class_desc],  
[ObjectName] = OBJECT_NAME(perm.major_id), 
[ColumnName] = col.[name] 
FROM  
--database user 
sys.database_principals princ 
LEFT JOIN 
--Login accounts 
sys.login_token ulogin on princ.[sid] = ulogin.[sid] 
LEFT JOIN   
--Permissions 
sys.database_permissions perm ON perm.[grantee_principal_id] = princ.[principal_id] 
LEFT JOIN 
--Table columns 
sys.columns col ON col.[object_id] = perm.major_id 
       AND col.[column_id] = perm.[minor_id] 
LEFT JOIN 
sys.objects obj ON perm.[major_id] = obj.[object_id] 
WHERE 
princ.[type] in ('S','U') 
UNION 
--List all access provisioned to a sql user or windows user/group through a database or application role 
SELECT 
[UserName] = CASE memberprinc.[type] 
       WHEN 'S' THEN memberprinc.[name] 
       WHEN 'U' THEN ulogin.[name] COLLATE Latin1_General_CI_AI 
      END, 
[UserType] = CASE memberprinc.[type] 
       WHEN 'S' THEN 'SQL User' 
       WHEN 'U' THEN 'Windows User' 
      END, 
[DatabaseUserName] = memberprinc.[name], 
[Role] = roleprinc.[name],  
[PermissionType] = perm.[permission_name],  
[PermissionState] = perm.[state_desc],  
[ObjectType] = obj.type_desc,--perm.[class_desc], 
[ObjectName] = OBJECT_NAME(perm.major_id), 
[ColumnName] = col.[name] 
FROM  
--Role/member associations 
sys.database_role_members members 
JOIN 
--Roles 
sys.database_principals roleprinc ON roleprinc.[principal_id] = members.[role_principal_id] 
JOIN 
--Role members (database users) 
sys.database_principals memberprinc ON memberprinc.[principal_id] = members.[member_principal_id] 
LEFT JOIN 
--Login accounts 
sys.login_token ulogin on memberprinc.[sid] = ulogin.[sid] 
LEFT JOIN   
--Permissions 
sys.database_permissions perm ON perm.[grantee_principal_id] = roleprinc.[principal_id] 
LEFT JOIN 
--Table columns 
sys.columns col on col.[object_id] = perm.major_id 
       AND col.[column_id] = perm.[minor_id] 
LEFT JOIN 
sys.objects obj ON perm.[major_id] = obj.[object_id] 
) 
SELECT * FROM CTE 

このクエリの問題は、私はSQL Server上の10個のデータベースを持っているならば、私は別のデータベースからレポートを取得するために10回を実行する必要があり、手動でのデータベースでこのステートメントを実行する必要があります。

私はこの仕事を自動化すると思っていますが、私は次のSQL文によってSQL Serverからデータベースのリストを取得することを考えています。

SELECT name 
FROM master.dbo.sysdatabases 

これらの結果をストア手順に渡します。しかし、私はそこに立ち往生しています、どんな助けも大歓迎です。

答えて

1

これを達成する方法はいくつかあります。

1)EXEC sp_MSforeachdbは、サーバー上の各データベースにクエリを実行するために、このようなコマンドを使用することができます
を@コマンド。例here

2)カーソル
ます。またCursor使用することができ、例えば、here

3)動的SQL
最後のオプションは、IMO Dynamic SQLにクエリを書き換えています。例here

これはどれくらい正確に動作するか、結果が何であるか、つまり結果が保存されているテーブルか、結果をSSMSで見るかによって異なります。

+0

提案していただきありがとうございます。カーソル+動的SQLを使用してレポートを取得できました。 – user664481

-1

stored procedureを作成してレポートを作成することをお勧めします。

関連する問題