2011-11-17 12 views
22

Necesito hacer un procedimiento almacenado que cree un usuario en más de una base de datos. Algo como esto:Usar la base de datos dentro de un procedimiento almacenado

USE [database1] 

CREATE USER [userLogin] FOR LOGIN [userLogin] 

USE [database2] 

CREATE USER [userLogin] FOR LOGIN [userLogin] 

Desde la declaración CREATE USER hace su trabajo en la base de datos actual que necesito utilizar la instrucción USE para cambiar entre bases de datos, pero no se puede utilizar dentro de los procedimientos almacenados.

¿Cómo puedo hacer esto?

+0

+1, pregunta útil. –

Respuesta

20

SQL dinámico

CREATE PROCEDURE spTestProc 
AS 

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

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

Usando sp_executesql parece funcionar, para más información ver http://msdn.microsoft.com/en-us/library/ms175170.aspx

he comprobado el uso de este y ha funcionado muy bien:

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

El USE solo debe estar dentro del alcance de la llamada sp_executesql, no del procedimiento almacenado externo – gbn

+1

Como señaló gbn, el alcance del comando USE será local para el SQL ejecutado con sp_executesql. –

5

SQL Server nosotros un da sistema de procedimiento almacenado para hacer esto. Mi opinión es que el método recomendado sería utilizar 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

Una comprobación rápida muestra que están en desuso http://msdn.microsoft.com/en-us/library/ms178013.aspx. – gbn

+0

@gbn - buena captura. No estaba enterado de eso. Sin embargo, lo investigaré tan pronto como llegue a casa. Parece que posiblemente sea necesaria una combinación de CREATE LOGIN y CREATE USER. Afortunadamente, el proceso sp_grantdbaccess obsoleto (pero aún funcional) servirá las necesidades del OP por el momento. – 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 

ahora se trabaja.

1

lo hice, como a continuación:

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

Debe tenerse en cuenta que si desea utilizar comillas simples dentro de un comando EXEC, necesitará el doble de la cantidad de comillas simples

por ejemplo,

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

En este ejemplo, John tiene 2 comillas simples antes y después. No puede usar comillas dobles para este tipo de consulta.

Cuestiones relacionadas