2011-11-17 14 views
22

複数のデータベースにユーザーを作成するストアドプロシージャを作成する必要があります。このような何か:ストアドプロシージャ内でデータベースを使用する

CREATE USER文は、私はデータベース間で変更する USEステートメントを使用する必要があり、現在のデータベースに彼の仕事をしていませんが、それは、ストアドプロシージャ内では使用できませんので
USE [database1] 

CREATE USER [userLogin] FOR LOGIN [userLogin] 

USE [database2] 

CREATE USER [userLogin] FOR LOGIN [userLogin] 

どうすればいいですか?

CREATE PROCEDURE spTestProc 
AS 
BEGIN 

EXECUTE sp_executesql N'USE DB1;' 

SELECT * FROM TABLE1 
EXECUTE sp_executesql N'USE DB2;' 

SELECT * FROM Table2 

END 

exec spTestProc 
+0

+1、便利な質問。 –

答えて

20

動的SQL

CREATE PROCEDURE spTestProc 
AS 

EXEC ('USE [database1]; CREATE USER [userLogin] FOR LOGIN [userLogin]') 

EXEC ('USE [database2]; CREATE USER [userLogin] FOR LOGIN [userLogin]') 
GO 
0

は、より多くの情報がhttp://msdn.microsoft.com/en-us/library/ms175170.aspx

を見るために、私はこれを使用してそれをテストし、それがうまく働いた、動作するようですシステムのストアドプロシージャを実行します。今、それが働いている

CREATE PROCEDURE usp_CreateTwoUSers 

AS 
BEGIN 

    -- Create a user for a login in the current DB: 
    Exec sp_grantdbaccess [userLogin], [name_in_db]; 

    -- Create a user for a login in an external DB: 
    Exec ExternalDatabaseName.sys.sp_grantdbaccess [userLogin], [name_in_db]; 

END 
+1

USEは、外部ストアド・プロシージャではなく、sp_executesqlコールのスコープ内にある必要があります。 – gbn

+1

gbnが指摘するように、USEコマンド・スコープはsp_executesqlで実行されるSQLに対してローカルになります。 –

5

SQL Serverは、私達与える:sp_executesqlを使用して

+2

クイックチェックは、これらが非推奨であることを示しています。http://msdn.microsoft.com/en-us/library/ms178013.aspx – gbn

+0

@gbn - いいキャッチです。私はそれを知らなかった。しかし、家に帰るとすぐに私はそれを調べていきます。潜在的にCREATE LOGINとCREATE USERの組み合わせが必要になる可能性があります。うまくいけば、(まだ機能している)廃止されたsp_grantdbaccess procがOPのニーズを現時点で提供することを望みます。 – XIVSolutions

1
CREATE PROCEDURE spTestProc 
AS 
BEGIN 

EXECUTE sp_executesql N'USE DB1 SELECT * FROM TABLE1' 


EXECUTE sp_executesql N'USE DB2 SELECT * FROM Table2' 


END 

exec spTestProc 

:私の理解では、推奨される方法はsys.sp_grantdbaccessを用いることであろうということです。

1

私は以下のようにそれをやった:

Alter Procedure testProc 
@dbName varchar(50) 
As 
declare @var varchar(100) 
set @var = 'Exec(''create table tableName(name varchar(50))'')'  
Exec('Use '+ @dbName + ';' + @var) 
Exec testProc 'test_db' 
0

あなたがEXECコマンド内の単一引用符を使用する場合、あなたは

例えば単一引用符の量を2倍にする必要がありますことに留意すべきです

EXEC ('USE [database1]; select * from Authors where name = ''John'' ') 

この例では、Johnには前後に2つの単一引用符があります。 このタイプのクエリには二重引用符を使用できません。

関連する問題