हमने स्कीमा और डेटा निकालने के लिए SSMS स्क्रिप्ट पीढ़ी के संयोजन का उपयोग करके समाप्त किया, और फिर अपने स्वयं के डेटाबेस टूल का उपयोग किया जो स्क्रिप्ट में कीवर्ड पार्सिंग और टोकन आधारित प्रतिस्थापन की अनुमति देता है। यह भी सुनिश्चित करता है कि स्क्रिप्ट केवल एक बार लागू की जाती हैं।
क्यों?
- हमें SQL Server 2000, 2005 और 2008 में इंस्टॉलेशन का समर्थन करने की आवश्यकता है, और संस्करणों के बीच डेटा प्रकारों में परिवर्तन हैं, जैसे 2005+ में nvarchar (अधिकतम) है, जबकि 2000 केवल ntext का समर्थन करता है। तो हमारी स्क्रिप्ट एक टोकन का उपयोग करती है और सही प्रकार के साथ db च्वाइस की जगह पर आधारित होती है।
- निष्पादन के बाद कुछ स्क्रिप्टों के निष्पादन के लिए प्रतीक्षा अवधि की आवश्यकता होती है, उदाहरण के लिए, हमने पाया कि यदि आपने स्क्रिप्ट के माध्यम से एक नया डेटाबेस बनाने के बाद कुछ सेकंड इंतजार नहीं किया, तो SQL सर्वर कभी-कभी विफल हो सकता है (क्योंकि इसमें db बनाने का समय नहीं है फ़ाइलें) जब यह टेबल बनाने के लिए चला गया, आदि।
- हम इस बात का इतिहास बनाए रखना चाहते थे कि कौन सी लिपियों का निष्पादन किया गया और कब।
- हम कनेक्शन स्ट्रिंग और क्रेडेंशियल्स को निर्दिष्ट करने के लिए अपने Wix MSI इंस्टॉलर को अनुमति देना चाहते थे, और इसे स्क्रिप्ट में पारित करने के लिए किसी तरह की आवश्यकता थी, इसलिए टोकन और कुछ सशर्त तर्क का उपयोग करते हुए।
उदाहरण लिपि (संक्षिप्तता के लिए संपादित)
-- Sleep: 5
-- Sleep after creating database to allow file system to create db files
CREATE DATABASE [$Database$]
GO
EXEC sp_dbcmptlevel [$Database$], $CompatabilityLevel$
GO
USE [$Database$]
GO
IF '1'!='$IntegratedSecurity$'
BEGIN
CREATE LOGIN [$Login$] WITH PASSWORD=N'$Password$', DEFAULT_DATABASE=[$Database$]
CREATE USER [$User$] FOR LOGIN [$Login$]
EXEC sp_addrolemember N'db_owner', N'$User$'
END
GO