visual studio 2013 - विजुअल स्टूडियो 2013 डेटाबेस प्रोजेक्ट ड्रॉप कॉलम




visual-studio-2013 database-project (4)

डेटाटेबल में डेटा की पंक्तियां होने पर किसी को डेटाबेस से मौजूदा कॉलम ड्रॉप करने का सबसे अच्छा तरीका पता है।

मैंने जो कोशिश की वह काम नहीं करना प्रतीत होता है। मैंने डेटाबेस प्रोजेक्ट के साथ एक पूर्व परिनियोजन स्क्रिप्ट शामिल की है जो करता है

GO
if exists(select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'Mercury.dbo.Discounts' and COLUMN_NAME = 'ColumnToRemove')
BEGIN
    ALTER TABLE Database.dbo.Table1 Drop Column ColumnToRemove
END
GO

फिर पहली बार तालिका बनाई गई स्क्रिप्ट में मैंने तालिका तालिका स्क्रिप्ट से प्रश्न में कॉलम हटा दिया

जब डैपैक का निष्पादन किया गया तो मुझे निम्नलिखित मिलते हैं

Initializing deployment (Start)
*** The column [dbo].[Table1].[ColumnToRemove] is being dropped, data loss could occur.
Initializing deployment (Complete)
Analyzing deployment plan (Start)
Analyzing deployment plan (Complete)
Updating database (Start)
An error occurred while the batch was being executed.
Updating database (Failed)
*** Could not deploy package.
Warning SQL72015: The column [dbo].[Table1].[ColumnToRemove] is being dropped, data loss could occur.
Error SQL72014: .Net SqlClient Data Provider: Msg 50000, Level 16, State 127, Line 6 Rows were detected. The schema update is terminating because data loss might occur.
Error SQL72045: Script execution error.  The executed script:
IF EXISTS (SELECT TOP 1 1
           FROM   [dbo].[Table1])
    RAISERROR (N'Rows were detected. The schema update is terminating because data loss might occur.', 16, 127)
        WITH NOWAIT;    

आपको डेटाबेस प्रोजेक्ट गुणों को संशोधित करने की आवश्यकता है

  1. परियोजना गुणों पर जाएं
  2. डीबग टैब
  3. नीचे दी गई तस्वीर में इस डेटा की जांच हटाएं "डेटा हानि हो सकती है तो अवरोधक परिनियोजन अवरुद्ध करें"


आपको प्रोजेक्ट में केवल एक बार ऐसा करना होगा (पूर्व-तैनाती स्क्रिप्ट में नहीं) और जब आप प्रकाशित करेंगे, तो आपको "डेटा हानि की अनुमति देने" के विकल्प के साथ ऐसा करने की आवश्यकता होगी। यदि आप कॉलम छोड़ रहे हैं तो मुझे संभावित डेटा हानि के आसपास कोई रास्ता नहीं दिख रहा है। एक बार ऐसा करने के बाद आप उस सेटिंग को हमेशा बदल सकते हैं।


मेरी स्थिति में ...

स्कीमा का उपयोग विजुअल स्टूडियो 2015 में तुलना करें। स्कीमा की खिड़की की खुली तुलना करने के बाद:

  1. स्कीमा विकल्प की तुलना करें (मेनू पट्टी में छोटा गियर आइकन)।
  2. सामान्य टैब पर जाएं
  3. संभावित डेटा हानि पर ब्लॉक अनचेक करें

यह सत्र की अवधि के लिए अन-चेक किया गया है। जब आपने सत्र से बाहर निकलते हैं तो मैंने पुष्टि नहीं की है कि यह चेक किया गया है या नहीं।


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

उदाहरण प्री-तैनाती स्क्रिप्ट:

IF EXISTS (SELECT *
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_SCHEMA = 'YourSchema'
    AND TABLE_NAME = 'YourTable'
    AND COLUMN_NAME = 'ColumnToBeDropped')
BEGIN

    CREATE TABLE [Upgrade].[YourTable](
        [YourTableId] [int] NOT NULL,
        [KeepThisColumn] [money] NOT NULL)

    INSERT INTO Upgrade.YourTable
    (YourTableId, KeepThisColumn)
    SELECT YourTableId, KeepThisColumn
    FROM YourSchema.YourTable

    TRUNCATE TABLE YourSchema.YourTable

END

फिर डेटाबेस प्रोजेक्ट आपके डेटाबेस से ड्रॉप करने के लिए कॉलम को हटा देगा।

डेटा को वास्तविक तालिका में स्थानांतरित करने के लिए आपको एक पोस्ट तैनाती स्क्रिप्ट की आवश्यकता होगी। उदाहरण पोस्ट तैनाती स्क्रिप्ट:

IF EXISTS (SELECT *
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA = 'Upgrade'
    AND TABLE_NAME = 'YourTable')
BEGIN

    SET IDENTITY_INSERT YourSchema.YourTable ON

    INSERT INTO YourSchema.YourTable
    (YourTableId, KeepThisColumn)
    SELECT YourTableId, KeepThisColumn
    FROM Upgrade.YourTable

    SET IDENTITY_INSERT YourSchema.YourTable OFF

    DROP TABLE Upgrade.YourTable

END




database-project