Je dois créer une procédure stockée qui crée un utilisateur dans plusieurs bases de données. Quelque chose comme ça:
USE [database1]
CREATE USER [userLogin] FOR LOGIN [userLogin]
USE [database2]
CREATE USER [userLogin] FOR LOGIN [userLogin]
Étant donné que l'instruction CREATE USER
fait son travail dans la base de données actuelle, je dois utiliser l'instruction USE
pour changer de base de données, mais elle ne peut pas être utilisée dans des procédures stockées.
Comment puis-je faire ceci?
SQL dynamique
CREATE PROCEDURE spTestProc
AS
EXEC ('USE [database1]; CREATE USER [userLogin] FOR LOGIN [userLogin]')
EXEC ('USE [database2]; CREATE USER [userLogin] FOR LOGIN [userLogin]')
GO
SQL Server nous donne une procédure stockée système pour le faire. Si j'ai bien compris, la méthode recommandée serait d'utiliser 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
Je l'ai fait comme ci-dessous:
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'
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
maintenant c'est travaillé.
Utiliser sp_executesql
semble fonctionner. Pour plus d'informations, voir http://msdn.Microsoft.com/en-us/library/ms175170.aspx
Je l'ai testé avec cela et cela a bien fonctionné:
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
Il est à noter que si vous souhaitez utiliser des guillemets simples dans une commande EXEC, vous devez doubler le nombre de guillemets simples.
par exemple.
EXEC ('USE [database1]; select * from Authors where name = ''John'' ')
Dans cet exemple, John a 2 guillemets simples avant et après . Vous ne pouvez pas utiliser de guillemets doubles pour ce type de requête.