2011-11-17 9 views
22

मुझे एक संग्रहीत प्रक्रिया बनाने की आवश्यकता है जो उपयोगकर्ता को एक से अधिक डेटाबेस में बनाता है। कुछ इस तरह:संग्रहीत प्रक्रिया के अंदर डेटाबेस का उपयोग करें

USE [database1] 

CREATE USER [userLogin] FOR LOGIN [userLogin] 

USE [database2] 

CREATE USER [userLogin] FOR LOGIN [userLogin] 

के बाद से CREATE USER बयान वर्तमान डेटाबेस मैं USE कथन का उपयोग करने के लिए डेटाबेस के बीच बदलने की जरूरत है में अपने काम करता है, लेकिन यह संग्रहित प्रक्रियाओं के अंदर नहीं किया जा सकता।

मैं यह कैसे कर सकता हूं?

+0

+1, उपयोगी प्रश्न। –

उत्तर

20

गतिशील एसक्यूएल

CREATE PROCEDURE spTestProc 
AS 

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

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

का उपयोग sp_executesql काम करने के लिए, अधिक जानकारी के लिए http://msdn.microsoft.com/en-us/library/ms175170.aspx

मैं इस का उपयोग करते हुए यह परीक्षण किया देखने लगता है और यह ठीक काम किया:

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

यूएसई केवल sp_executesql कॉल के दायरे में होना चाहिए, बाहरी संग्रहीत प्रक्रिया – gbn

+1

जैसा कि जीबीएन ने इंगित किया है, यूएसई कमांड स्कोप SP_executesql के साथ निष्पादित SQL के लिए स्थानीय होगा। –

5

एसक्यूएल सर्वर हमें एक देता है ऐसा करने के लिए सिस्टम संग्रहीत प्रक्रिया। मैं समझता हूँ कि सिफारिश की विधि 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

एक त्वरित जांच से पता चलता है कि इन्हें हटा दिया गया है http://msdn.microsoft.com/en-us/library/ms178013.aspx। – gbn

+0

@ जीबीएन - अच्छा पकड़ो। मुझे इस बारे में पता नहीं था। हालांकि, जैसे ही मैं घर आता हूं, मैं इसे देख लूंगा। ऐसा लगता है कि संभावित रूप से बनाने के लिए एक संयोजन और उपयोगकर्ता बनाना आवश्यक हो सकता है। उम्मीद है कि बहिष्कृत (लेकिन अभी भी कार्यात्मक) sp_grantdbaccess proc इस पल के लिए ओपी की जरूरतों को पूरा करेगा। – 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 

अब यह काम किया है।

1

मैं इसे नीचे पसंद आया:

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

यह ध्यान देने योग्य है कि आप एक EXEC आदेश के भीतर एकल उद्धरण का उपयोग करना चाहते हैं, तो आप एकल उद्धरण

जैसे की राशि को दोगुना करने की आवश्यकता होगी

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

इस उदाहरण में, जॉन के पहले और बाद में 2 एकल उद्धरण हैं। आप इस प्रकार की क्वेरी के लिए डबल कोट्स का उपयोग नहीं कर सकते हैं।

संबंधित मुद्दे