2011-10-25 13 views
0

私は、複数のライブラリに基づいたソフトウェアスイートを持っています。SQL Serverの複数ステップストアドプロシージャ

1ライブラリ= 1 SQLデータベース。

異なるユーザーは、異なるライブラリに異なるアクセス権を持つことができます。

また、データベースには特定の方法で名前が付けられ、「マイナー」と「マイナー」の識別に役立ちます。

私は@UserNameという変数を取り、@UserNameがテーブルUSERSで発見されMYDBで始まる名前を持つデータベースを返すストアドプロシージャを作成したいと思います。

私はEXEC sp_databasesで始まると考えていますが、どのように続行するかは分かりません。私が知っている必要があり何

は次のとおりです。

  1. 私は私のパターンに一致する名前を持つだけでデータベースを引き出すためにsp_databasesの結果を反復処理する方法を教えてください。
  2. USERSテーブルの[USER NAME]列の#1から返された各データベースの@UserNameを確認するにはどうすればよいですか?

私はそれが一時テーブルとカーソルと関係があると推測していますが、どこから始めるのかはわかりません。

助けが必要ですか?

ありがとうございます!

答えて

2

ここに、アプローチを示す概念コードがいくつかあります。 sys.databasesには、アクセス可能なデータベースの一覧が含まれています。あなたは、かなりの部分でダイナミックSQLを使用する必要があります。 1については

CREATE PROCEDURE MyDBs @userName VARCHAR(255) 
AS 
BEGIN 

DECLARE @max INT 
DECLARE @i INT 
DECLARE @sql VARCHAR(500) 

CREATE TABLE #SQL 
(
    rid int identity primary key clustered, 
    query varchar(500) 
) 

INSERT INTO #SQL(query) 
SELECT 'SELECT * FROM ['+ name '+].USERS WHERE username = @UserName' 
FROM master.sys.databases 
WHERE NAME LIKE '%yourpattern%' 

SELECT @max = @@rowcount, @i = 1 

WHILE @i <= @max 
BEGIN 
    SELECT @sql = query FROM #sql WHERE rid = @i 
    EXEC @sql 
    SET @i = @i + 1 
END 

DROP TABLE #SQL 
+0

私は、これを少し変更したバージョンになってしまいましたあなたは間違いなく私を正しい軌道に乗せました!ありがとう! – mbm29414

1

、ちょうどそれをコピーし、sp_databasesコードを見て、自分のニーズに合わせて変更します。 (たとえば、これはPROCを保存sp_databasesの実際のコードであるあなたは、マスタDBにそれを見ることができます句の最後の2つの条件を参照してください。):

declare @UserName varchar(50)='someuser' 
select 
     DATABASE_NAME = db_name(s_mf.database_id), 
     DATABASE_SIZE = convert(int, 
            case -- more than 2TB(maxint) worth of pages (by 8K each) can not fit an int... 
            when convert(bigint, sum(s_mf.size)) >= 268435456 
            then null 
            else sum(s_mf.size)*8 -- Convert from 8192 byte pages to Kb 
            end), 
     REMARKS   = convert(varchar(254),null) 
    from 
     sys.master_files s_mf 
    where 
     s_mf.state = 0 and -- ONLINE 
     has_dbaccess(db_name(s_mf.database_id)) = 1 and 
     --db_name(s_mf.database_id) like '%'[email protected]+'%' and exists -- you may or may not want to leave this condition here. You'll figure out what condition to use 
     (select 1 from databasename.dbo.Users where [UserName][email protected]) 
    group by s_mf.database_id 
    order by 1 
関連する問題