0

セキュリティ>ログイン>プロパティ>ユーザーマッピングと同様に、ユーザーにマップされたすべてのデータベースを照会しようとしています。

これは、可能であれば SQL 2005 で行うことができます。

たとえば、次のようなものです。

SELECT name
FROM sys.databases
WHERE HAS_DBACCESS(name) = 1

ただし、上記のクエリをユーザー自体として実行するのではなく、管理ユーザーからクエリを実行してください。

このようなことはどのように実行されますか?

ありがとうございました。

4

2 に答える 2

2

これは最初の一歩かもしれませんが、おそらくあなたが望む良い出力ではありません (そして、2 つの結果セットが生成されます)。

EXEC sp_helplogins N'floob';

ただし、SQL Server 2000 では機能します。手順の一部の機能を試して複製したい場合は、基本的にすべてのデータベースでカーソルを使用してアクセス許可をチェックする方法を確認できます。SQL Server 2000 の場合:

EXEC sp_helptext N'sp_helplogins';

2005 年以降は、OBJECT_DEFINITION() の出力を好みます。

SELECT OBJECT_DEFINITION(OBJECT_ID(N'sys.sp_helplogins'));

したがって、同様のロジックに基づいて独自のカーソルを作成し、出力をよりきれいにすることができます...

以下は簡単な (そして完全ではない) 例です。多くはカバーしていませんが、上記が十分でない場合に開始するためのアイデアです。

DECLARE @login NVARCHAR(255);
SET @login = N'foobarblat';

-- above would be an input parameter to a procedure, I presume

CREATE TABLE #dbs(name SYSNAME);

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';

SELECT @sql = @sql + N'INSERT #dbs SELECT ''' + name + ''' FROM ' 
  + QUOTENAME(name) + '.sys.database_principals AS u
  INNER JOIN sys.server_principals AS l
  ON u.sid = l.sid
  WHERE l.name = @login;'
FROM sys.databases 
WHERE state_desc = 'ONLINE'
AND user_access_desc = 'MULTI_USER';

EXEC sp_executesql @sql, N'@login SYSNAME', @login;

SELECT name FROM #dbs;

DROP TABLE #dbs;

私が言ったように、これは完全ではありません。ユーザーが接続を拒否されているかどうか、拒否リーダー/ライター ロールのメンバーであるかどうか、データベース内のユーザー名がログインと一致しない場合にエイリアスが表示されないかどうかはわかりません。詳細については、sp_helplogins何を見せたいかによる。

于 2012-06-14T16:58:22.370 に答える
0

EXECUTE AS機能は 2005 リリースで追加されたので、2000 年には実行できないと思います。関連するコードをジョブに入れ、ジョブの所有者を管理者ユーザーに設定することでおそらく模倣できますが、インラインでないジョブで処理します。

于 2012-06-14T16:38:52.477 に答える