2011-11-17 29 views
22

Tôi cần thực hiện một quy trình được lưu trữ để tạo người dùng trong nhiều cơ sở dữ liệu. Một cái gì đó như thế này:Sử dụng cơ sở dữ liệu bên trong một thủ tục đã lưu

USE [database1] 

CREATE USER [userLogin] FOR LOGIN [userLogin] 

USE [database2] 

CREATE USER [userLogin] FOR LOGIN [userLogin] 

Kể từ khi tuyên bố CREATE USER làm xong nhiệm vụ của mình trong cơ sở dữ liệu hiện tại tôi cần phải sử dụng câu lệnh USE để thay đổi giữa cơ sở dữ liệu, nhưng nó không thể được sử dụng bên trong thủ tục lưu trữ.

Tôi làm cách nào để thực hiện việc này?

+0

+1, câu hỏi hữu ích. –

Trả lời

20

động 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

Sử dụng sp_executesql dường như để làm việc, để biết thêm thấy http://msdn.microsoft.com/en-us/library/ms175170.aspx

Tôi đã thử nghiệm nó bằng cách sử này và nó làm việc tốt:

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 chỉ nên nằm trong phạm vi cho cuộc gọi sp_executesql, không phải thủ tục được lưu trữ bên ngoài – gbn

+1

Như gbn đã chỉ ra, phạm vi lệnh USE sẽ là cục bộ đối với SQL được thực thi với sp_executesql. –

5

SQL Server cung cấp cho chúng ta một hệ thống lưu trữ thủ tục để làm điều này. sự hiểu biết của tôi là phương pháp được gợi ý sẽ được sử dụng 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

Kiểm tra nhanh cho thấy những điều này không được chấp nhận http://msdn.microsoft.com/en-us/library/ms178013.aspx. – gbn

+0

@gbn - bắt thú vị. Tôi đã không nhận thức được điều đó. Tuy nhiên, tôi sẽ xem xét nó ngay sau khi tôi về nhà. Có vẻ như một sự kết hợp giữa CREATE LOGIN và CREATE USER có thể là cần thiết. Hy vọng rằng sp_grantdbaccess proc không dùng nữa (nhưng vẫn hoạt động) sẽ phục vụ nhu cầu của OP cho thời điểm này. – 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 

bây giờ nó đang làm việc.

1

tôi đã làm nó như dưới đây:

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

Cần lưu ý rằng nếu bạn muốn sử dụng dấu nháy đơn trong vòng một lệnh EXEC, bạn sẽ cần phải tăng gấp đôi số lượng dấu nháy đơn

ví dụ

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

Trong ví dụ này, John có 2 dấu nháy đơn trước và sau nó. Bạn không thể sử dụng dấu ngoặc kép cho loại truy vấn này.

Các vấn đề liên quan