2011-11-17 18 views
22

Potrzebuję wykonać procedurę składowaną, która tworzy użytkownika w więcej niż jednej bazie danych. Coś takiego:Używanie bazy danych wewnątrz procedury przechowywanej

USE [database1] 

CREATE USER [userLogin] FOR LOGIN [userLogin] 

USE [database2] 

CREATE USER [userLogin] FOR LOGIN [userLogin] 

Ponieważ oświadczenie CREATE USER wykonuje swoją pracę w bieżącej bazie danych trzeba użyć oświadczenie USE zmienić między bazami danych, ale to nie może być używane wewnątrz procedur przechowywanych.

Jak mogę to zrobić?

+0

+1, przydatne pytanie. –

Odpowiedz

20

Dynamiczny 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

Korzystanie sp_executesql wydaje się działać, aby uzyskać więcej informacji zobacz http://msdn.microsoft.com/en-us/library/ms175170.aspx

Testowałem go za to i to działało w porządku:

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

USE powinien być w zasięgu dla wywołania sp_executesql, a nie zewnętrznej procedury przechowywanej. – gbn

+1

Jak wskazano w gbn, zakres poleceń USE będzie lokalny dla SQL wykonywanego za pomocą sp_executesql. –

5

SQL Server daje nam systemowa procedura składowana, aby to zrobić. W moim rozumieniu jest to zalecana metoda byłoby użyć 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

Szybkie sprawdzenie pokazuje, że są to przestarzałe http://msdn.microsoft.com/en-us/library/ms178013.aspx. – gbn

+0

@gbn - ładny połów. Nie wiedziałem o tym. Jednak będę się nad tym zastanawiać, jak tylko wrócę do domu. Wygląda na to, że może być konieczna kombinacja CREATE LOGIN i CREATE USER. Mam nadzieję, że przestarzały (ale wciąż funkcjonalny) proces sp_grantdbaccess będzie obsługiwał potrzeby PO na chwilę obecną. – 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 

teraz jest on pracował.

1

Zrobiłem to jak poniżej:

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

Należy zauważyć, że jeśli chcesz używać apostrofów wewnątrz polecenia EXEC, trzeba będzie podwoić ilość apostrofami

przykład

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

W tym przykładzie John ma 2 pojedyncze cudzysłowy przed i po nim. Nie można użyć podwójnego cudzysłowu dla tego typu zapytania.

Powiązane problemy