0

以下のコードを使用して、うまく機能するデータベースの孤立したユーザーのリストを取得しています。私は今、データベースのリストを繰り返し処理し、結果を単一のテーブルに返すものにこれを構築しようとしています。

孤立したユーザーを取得するために使用しているコードは次のとおりです。

select DB_NAME() AS [Current Database], u.uid, u.name, u.sid, rm.role_principal_id as 'Role ID', dp1.name as 'Role'
from sys.sysusers u
left join sys.syslogins l on UPPER(u.sid) = UPPER(l.sid)
inner join sys.database_role_members rm on rm.member_principal_id = u.uid
left join sys.database_principals dp on dp.principal_id = rm.member_principal_id
left join sys.database_principals dp1 on dp1.principal_id = rm.role_principal_id 
where u.uid > 4 and u.issqlrole = 0
--and issqluser = 1 --commented out to include orphaned windows logins
and l.name is null
order by 1

以下を使用してデータベースのリストを取得できますが、上記と組み合わせて各データベースを順番に調べたいと思います。

SELECT name FROM sys.databases 
WHERE database_id > 4

これに関するヘルプやポインタは大歓迎です!

ありがとう :-)

4

2 に答える 2

0

システム ストアド プロシージャsp_msforeachdbを使用して、各データベースに対して一連の SQL ステートメントを実行できます。この場合、そのプロシージャを実行するたびに個別の結果セットが返されるため、一時テーブルを使用してすべての結果を 1 つのテーブルにまとめます。この単一のテーブルは、通常の SQL を使用して操作し、最終結果をフィルタリングおよびソートできます。

IF OBJECT_ID('tempdb..#Orphans') IS NOT NULL
  DROP TABLE #Orphans

CREATE TABLE #Orphans 
(
  [Current Database] SYSNAME,
  [uid]              SMALLINT,
  [name]             SYSNAME,
  [sid]              VARBINARY(85),
  [Role ID]          SMALLINT,
  [Role]             SYSNAME
)

INSERT #Orphans
EXEC sp_msforeachdb 'use [?];
    select DB_NAME() AS [Current Database]
         , u.uid, u.name
         , u.sid
         , rm.role_principal_id as [Role ID]
         , dp1.name as [Role]
      from sys.sysusers u
             left join sys.syslogins l 
               on UPPER(u.sid) = UPPER(l.sid)
                 inner join sys.database_role_members rm 
                   on rm.member_principal_id = u.uid
                     left join sys.database_principals dp 
                       on dp.principal_id = rm.member_principal_id
                         left join sys.database_principals dp1 
                           on dp1.principal_id = rm.role_principal_id 
     where u.uid > 4 and u.issqlrole = 0
     --and issqluser = 1 --commented out to include orphaned windows logins
       and l.name is null
    order by 1'

SELECT * FROM #Orphans

注意すべき点は、「?」テンプレートが新しいデータベースで実行されるたびに、SQL テンプレートの文字にデータベース名が入力されます。また、列のエイリアスを単一引用符の代わりに「[」文字を使用するように変更しました。

于 2013-10-03T11:06:37.893 に答える