निर्यात के बजाय, मैन्युअल रूप से संपादित करें, और फिर से चलाएँ, आप डेटाबेस में सीधे काम कर सकते हैं जैसे कुछ:
DECLARE C CURSOR FOR
SELECT sm.definition, so.type
FROM sys.objects so
JOIN sys.all_sql_modules sm ON sm.object_id = so.object_id
WHERE so.type IN ('P', 'V')
ORDER BY so.name
DECLARE @SQL NVARCHAR(MAX), @ojtype NVARCHAR(MAX)
OPEN C
FETCH NEXT FROM C INTO @SQL, @ojtype
WHILE @@FETCH_STATUS = 0 BEGIN
IF @objtype = 'P' SET @SQL = REPLACE(@SQL, 'CREATE PROCEDURE', 'ALTER PROCEDURE')
IF @objtype = 'V' SET @SQL = REPLACE(@SQL, 'CREATE VIEW' , 'ALTER VIEW' )
SET @SQL = REPLACE(@SQL, 'GETDATE()', '[dbo].[getlocaldate]()')
--PRINT @SQL
EXEC (@SQL)
FETCH NEXT FROM C INTO @SQL, @ojtype
END
CLOSE C
DEALLOCATE C
बेशक यह कार्य, ट्रिगर, और आगे भी से निपटने के लिए।
कुछ कैविएट हैं:
आपको थोड़ा उज्जवल होने CREATE
और PROCEDURE
/ और / VIEW
/ के बीच अलग / अतिरिक्त श्वेत-रिक्त स्थान से निपटने की आवश्यकता हो सकती है <other>
। इसके बजाय REPLACE
आप इसके बजाय जगह छोड़ने CREATE
और DROP
पहले निष्पादित करने के लिए पसंद कर सकते हैं , लेकिन यह जोखिम छोड़ने वाले sys.depends
और दोस्तों को किल्टर से बाहर निकलता है ALTER
, भले ही ALTER
आप असफल न हों, कम से कम आपके पास मौजूदा वस्तु अभी भी है जहां आप DROP
+ के साथ CREATE
हो सकते हैं नहीं।
यदि आपके पास कोई "चतुर" गंध है, तो अपने स्वयं के स्कीमा को तदर्थ TSQL के साथ संशोधित करने की तरह गंध आती है, तो आपको यह सुनिश्चित करने की आवश्यकता होगी कि खोज और प्रतिस्थापन के लिए CREATE
-> ALTER
इसके साथ हस्तक्षेप न करें।
आप ऑपरेशन के बाद पूरे एप्लिकेशन (रों) को फिर से जांचना चाहेंगे, चाहे आप कर्सर का उपयोग करें या निर्यात + संपादित करें + चलाएं।
मैंने अतीत में इसी तरह के स्कीमा-वाइड अपडेट बनाने के लिए इस पद्धति का उपयोग किया है। यह थोड़ा हैक है, और काफी बदसूरत लगता है, लेकिन कभी-कभी यह सबसे आसान / तेज तरीका है।
चूक और अन्य बाधाओं को भी इसी तरह से संशोधित किया जा सकता है, हालांकि उन्हें केवल बदला जा सकता है और बदल दिया जा सकता है। कुछ इस तरह:
DECLARE C CURSOR FOR
SELECT AlterDefaultSQL = 'ALTER TABLE [' +st.name+ '] DROP CONSTRAINT [' + si.name + '];'
+ CHAR(10)
+ 'ALTER TABLE [' +st.name+ '] ADD CONSTRAINT [' + si.name + '] DEFAULT '+REPLACE(si.definition, 'GETDATE()', '[dbo].[getlocaldate]()')+' FOR '+sc.name+';'
FROM sys.tables st
JOIN sys.default_constraints si ON si.parent_object_id = st.object_id
JOIN sys.columns sc ON sc.default_object_id = si.object_id
DECLARE @SQL NVARCHAR(MAX)
OPEN C
FETCH NEXT FROM C INTO @SQL
WHILE @@FETCH_STATUS = 0 BEGIN
--PRINT @SQL
EXEC (@SQL)
FETCH NEXT FROM C INTO @SQL
END
CLOSE C
DEALLOCATE C
कुछ और मज़ेदार जिनके साथ आपको संघर्ष करने की आवश्यकता हो सकती है: यदि आप समय से विभाजन कर रहे हैं, तो उन भागों को भी बदलने की आवश्यकता हो सकती है। समय पर विभाजन को और अधिक दानेदार बनाने के बाद, दिन के DATETIME
हिसाब से दुर्लभ हो सकते हैं, ऐसे मुद्दे हो सकते हैं जहां विभाजन के कार्य को समय-सारणी के आधार पर पिछले या अगले दिन के रूप में समझा जा सकता है, जो आपके विभाजन को आपके सामान्य प्रश्नों से अलिखित नहीं करता है।