2010-12-17 11 views
5

हम उत्पादन वातावरण में माइग्रेट कर रहे हैं, और मैं एक लिखना चाहता हूं कि डीबीए aspnet_regsql के साथ जेनरेट की गई स्क्रिप्ट चलाने के बाद तुरंत उपयोगकर्ता के साथ भूमिका बना सकता है। विकास पर्यावरण में, मैं Global.asax.cs में सदस्यता प्रदाता के API के साथ उपयोगकर्ताओं और भूमिकाओं को जोड़ रहा हूं। लेकिन मैं इस कठोर कोडित दृष्टिकोण से बचना चाहता हूं। अब मेरी टी-एसक्यूएल की कमी का अभाव दिख रहा है। मैंने निम्नलिखित लिपि लिखी, जो काम करता है अगर मैं इसे एक साथ नहीं चलाता।SQLMembershipProvider के लिए SQL में उपयोगकर्ताओं और भूमिकाओं को कैसे जोड़ें?

Use MyApps_Prod; 
GO 

DECLARE @user_identity CHAR(40); 
DECLARE @scalar_userid AS NVARCHAR(255); 
DECLARE @scalar_roleid AS NVARCHAR(255); 
DECLARE @app_id AS NVARCHAR(255); 
SET @user_identity = N'AMERICAS\First.Last'; 

SET @app_id = (SELECT DISTINCT ApplicationId 
      FROM [dbo].[aspnet_Applications] 
      WHERE loweredapplicationname = 'MyApplication'); 
SELECT * FROM [dbo].[aspnet_Users] WHERE UserName = @user_identity 

IF NOT EXISTS (SELECT * FROM [dbo].[aspnet_Users] WHERE UserName = @user_identity) 
BEGIN 
    INSERT INTO [dbo].aspnet_Users 
      ([ApplicationId], [UserName], [LoweredUserName], [LastActivityDate]) 
    VALUES 
     (@app_id, @user_identity, LOWER(@user_identity), GETDATE()); 
END; 

DECLARE @role_name CHAR(40); 
SET @role_name = N'Communicator'; 
IF NOT EXISTS (SELECT * FROM [dbo].[aspnet_Roles] WHERE RoleName = @role_name) 
BEGIN 
    INSERT INTO [dbo].[aspnet_Roles] 
     ([ApplicationId], [RoleName], [LoweredRoleName]) 
    VALUES 
     (@app_id, @role_name, LOWER(@role_name)) 
END; 


SET @scalar_userid = (SELECT DISTINCT UserID FROM [dbo].aspnet_Users WHERE UserName = @user_identity); 
SET @scalar_roleid = (SELECT DISTINCT RoleID FROM [dbo].aspnet_Roles WHERE RoleName = @role_name); 

INSERT INTO [dbo].aspnet_UsersInRoles (UserID, RoleID) 
    VALUES (
     @scalar_userid , 
     @scalar_roleid 
    ); 


SET @role_name = N'AccessAdministrator'; 
IF NOT EXISTS (SELECT * FROM [dbo].[aspnet_Roles] WHERE RoleName = @role_name) 
BEGIN 
    INSERT INTO [dbo].[aspnet_Roles] 
     ([ApplicationId], [RoleName], [LoweredRoleName]) 
    VALUES 
     (@app_id, @role_name, LOWER(@role_name)) 
END; 


SET @scalar_roleid = (SELECT DISTINCT RoleID FROM [dbo].aspnet_Roles WHERE RoleName = @role_name); 

INSERT INTO [dbo].aspnet_UsersInRoles (UserID, RoleID) 
    VALUES (
     @scalar_userid , 
     @scalar_roleid 
    ); 
GO 

मैं पाया है कि अगर मैं अर्धविराम से प्रत्येक INSERT अंत है कि मैं INSERTs प्राप्त कर सकते हैं काम करने के लिए और फिर GO जोड़ने के लिए, लेकिन फिर मैं redeclare प्रत्येक चर पुन: असाइन करने की जरूरत है।

वास्तविक SQL डेवलपर यह कैसे करेगा?

+0

यदि सब कुछ विफल हो जाता है, तो इसे v1 के लिए global.asax में छोड़ दें और v2 के लिए इसे हटा दें। – Greg

उत्तर

10

हाथ से INSERT कथन लिखने की बजाय, संग्रहीत प्रक्रियाओं का उपयोग करें जो SqlMembershipProvider कार्यान्वयन प्रदाता का हिस्सा हैं और aspnet_reg.exe टूल का उपयोग कर एप्लिकेशन सेवाओं को इंस्टॉल करते समय शामिल किए गए हैं।

विशेष रूप से, का उपयोग करें:

  • aspnet_Roles_CreateRole एक उपयोगकर्ता बना सकते हैं और अपनी सदस्यता डेटा की आपूर्ति करने के लिए एक नई भूमिका
  • aspnet_Membership_CreateUser बनाने के लिए (पासवर्ड, सुरक्षा प्रश्न और उत्तर, और आगे)
  • aspnet_UsersInRoles_AddUsersToRoles किसी मौजूदा उपयोगकर्ता को मौजूदा भूमिका में जोड़ने के लिए

aspnet_Membership_CreateUser बहुत से एकमात्र मुश्किल है। मान लें कि आप अपने पासवर्ड को सादे-पाठ में नहीं संग्रहित कर रहे हैं, आपको @Password पैरामीटर के माध्यम से या तो शेड में शेड या एन्क्रिप्टेड संस्करण में पास करने की आवश्यकता है।मैं SqlMembershipProvider कक्षा के CreateUser method में कोड की जांच करने के लिए परावर्तक का उपयोग करने का सुझाव देता हूं। वहां आप देखेंगे कि .NET कवर के नीचे इस तर्क को कैसे संभालता है।

इसे स्क्रिप्ट करने के विकल्प के रूप में, एक कमांड लाइन प्रोग्राम लिखने पर विचार करें, शायद, एक टेक्स्ट फ़ाइल पढ़ता है और निर्दिष्ट भूमिकाएं और उपयोगकर्ता और उपयोगकर्ता-भूमिका संघ बनाता है। यह कमांड लाइन प्रोग्राम सीधे सदस्यता API का उपयोग करेगा और इसलिए, निम्न स्तर के सभी विवरणों को संभालेगा। फिर आप अपने निर्माण या तैनाती प्रक्रिया के हिस्से के रूप में इस कमांड लाइन प्रोग्राम को निष्पादित कर सकते हैं।

हैप्पी प्रोग्रामिंग!

+0

मुझे कमांड लाइन सुझाव पसंद है। – Greg

+0

यह एक आकर्षण की तरह काम किया। धन्यवाद। – Blanthor

2

क्या आपने SQL प्रोफाइलर के साथ अपने हार्ड-कोड किए गए कार्यान्वयन को चलाने का प्रयास किया है? इससे आपको चीजों को चलाने के लिए सही क्रम दिखाना चाहिए।

+0

मैं उस धन्यवाद का प्रयास करूंगा। – Blanthor

+0

यदि आप कर सकते हैं तो डेटाबेस में शामिल संग्रहित प्रक्रियाओं का कम से कम उपयोग करना चाहिए। प्रोफाइलर आपको दिखाएगा कि उनका उपयोग कैसे करें। – Greg

+0

+1 यह बहुत उपयोगी था धन्यवाद। – Blanthor

0

"एक वास्तविक एसक्यूएल डेवलपर यह कैसे करेगा?"

यहां एक शुरुआत है। जबकि टी-एसक्यूएल सीधे सरणी का समर्थन नहीं करता है, मैं आम तौर पर तालिका चर के माध्यम से लूप करता हूं, उन्हें कोड को सघन/पुन: उपयोग करने के लिए, सरणी के रूप में उनका इलाज करता हूं। आपके उदाहरण में, यह एक बड़ा लाभ नहीं है। लेकिन, अगर 10 rolenames थे, यह होगा।

उदाहरण:


DECLARE @roles TABLE (rolename CHAR(40)); 
INSERT @roles 
SELECT 'Communicator' 
UNION ALL 
SELECT 'AccessAdministrator'; 
DECLARE @rolename CHAR(40); 

--loop through the @roles table variable like it's an array 
WHILE (SELECT COUNT(*) FROM @roles) > 0 
    BEGIN 
    SELECT TOP 1 @rolename = rolename FROM @roles; 
    --Do something with the current rolename 
    SELECT @rolename; 
    DELETE @roles WHERE rolename = @rolename; 
    END 
0

एक अच्छी स्क्रिप्ट के माध्यम से इसे बनाने विचार नहीं है यही कारण है कि। साथ ही मुझे यकीन नहीं है कि जब आप एपीआई का उपयोग कर रहे हैं तो आपको मैन्युअल रूप से बनाना होगा। क्या आपने अपना मौजूदा डेटा माइग्रेट करने का प्रयास किया था?

लेकिन यदि यह विकल्प है तो मैं आपको उन सदस्यता/भूमिका विधियों के कोड को देखने के लिए परावर्तक उपकरण का उपयोग करने का सुझाव दूंगा। बस संग्रहित प्रो को चलाने के लिए पर्याप्त नहीं है क्योंकि एन्क्रिप्शन/हैशिंग हो सकती है, सही एप्लिकेशन चुनना नाम और आपके द्वारा किए गए कई अन्य चेकों को वेब एन्क्रिप्ग में सेट करने से पहले उन एपीआई विधियों द्वारा संग्रहीत प्रो निष्पादित किया जाता है।

तो सुनिश्चित करें कि आप उन सभी पर विचार करें क्योंकि आप उपयोगकर्ता विवरण डालने में सक्षम होंगे लेकिन जब आप इसका उपयोग करना चाहते हैं, तो आप API का उपयोग करेंगे और इससे कुछ और तोड़ सकता है।

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