2011-11-17 1 views
22

Ho bisogno di creare una stored procedure che crei un utente in più di un database. Qualcosa di simile a questo:Usa database all'interno di una stored procedure

USE [database1] 

CREATE USER [userLogin] FOR LOGIN [userLogin] 

USE [database2] 

CREATE USER [userLogin] FOR LOGIN [userLogin] 

Dal momento che la dichiarazione CREATE USER fa il suo lavoro nel database corrente ho bisogno di utilizzare l'istruzione USE di cambiare tra i database, ma non può essere utilizzato all'interno stored procedure.

Come posso fare questo?

+0

+1, domanda utile. –

risposta

20

SQL dinamico

CREATE PROCEDURE spTestProc 
AS 

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

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

Utilizzando sp_executesql sembra funzionare, per maggiori informazioni visita http://msdn.microsoft.com/en-us/library/ms175170.aspx

ho provato con questo ed ha funzionato benissimo:

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 
+1

L'USE deve essere incluso nella portata della chiamata sp_executesql, non nella stored procedure esterna – gbn

+1

Come sottolineato da gbn, l'ambito del comando USE sarà locale per l'SQL eseguito con sp_executesql. –

5

SQL Server noi una dona sistema stored procedure per fare questo. La mia comprensione è che il metodo consigliato sarebbe quella di utilizzare sys.sp_grantdbaccess:

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 
+2

Un controllo rapido mostra che questi sono deprecati http://msdn.microsoft.com/en-us/library/ms178013.aspx. – gbn

+0

@gbn - bella cattura. Non ero conscio di ciò. Tuttavia, lo esaminerò non appena torno a casa. Sembrerebbe che potenzialmente potrebbe essere necessaria una combinazione di CREATE LOGIN e CREATE USER. Speriamo che il proc deprecato (ma comunque funzionale) sp_grantdbaccess servirà per il momento le necessità dell'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 

ora si lavora.

1

ho fatto come di seguito:

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

Va notato che se si desidera utilizzare le virgolette singole all'interno di un comando EXEC, è necessario raddoppiare la quantità di singoli apici

esempio

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

In questo esempio, John ha 2 apici singoli prima e dopo di esso. Non è possibile utilizzare le virgolette per questo tipo di query.