मैं इसे पुनः बनाए बिना किसी दृश्य के लिए SCHEMABINDING कैसे स्विच करूं?


21

मैं SCHEMABINDINGइसे पुनः बनाए बिना किसी दृश्य के लिए कैसे बंद करूं?

जवाबों:


11

हाँ। यह अच्छा है कि आप SCHEMABINDING का उपयोग करते हैं (हम हमेशा करते हैं) और कभी-कभी आपको किसी आश्रित वस्तु को बदलने के लिए इसे निकालना पड़ता है। बस देखने के लिए

ALTER VIEW myView
--Remove this WITH SCHEMABINDING
AS
SELECT ...
GO

इसलिए मैंने किया, लेकिन कभी-कभी अन्य वस्तुएं (कार्य, विचार) इस पर निर्भर करती हैं। इसलिए इस झंडे को एक समय के लिए चिह्नित करना / चिन्हित करना अच्छा रहेगा :)। तो यह db के मौजूदा संस्करण में असंभव है, हाँ?
मारिक

@garik: सही है, मैं एक ही समस्या है। प्रत्येक आश्रित वस्तु पर ALTER चलाएं ... किसी भी समय SQL सर्वर नियमों को लागू करेगा: आप "स्विच ऑफ" नहीं कर सकते क्योंकि इससे असंगतता होगी
gbn

8

क्या आप यह देखने के लिए अनुमति नहीं देंगे? जब आप एक दृश्य बनाते हैं तो आप क्या करेंगे:

CREATE VIEW
WITH SCHEMABINDING
AS
SELECT stmt
GO

इसलिए, क्लॉज़ के साथ हारें:

ALTER VIEW viewname
AS
SELECT stmt
GO

MSDN पर अन्य दृश्य देखें


5

लगभग घंटों तक देखने के बाद, मैंने इसके लिए 2 संग्रहित खरीद बनाई। आशा है कि यह किसी की मदद करता है

CREATE PROCEDURE ViewRemoveSchemaBinding
    @ViewName VARCHAR(MAX)
AS
BEGIN
    DECLARE @PositionShemaBinding INT
    DECLARE @Command NVARCHAR(MAX)

    SELECT @Command = OBJECT_DEFINITION(OBJECT_ID(@ViewName));
    SET @PositionShemaBinding = CHARINDEX('WITH SCHEMABINDING', @Command)

    IF NOT @PositionShemaBinding = 0 BEGIN
        -- WITH SCHEMA BINDING IS PRESENT... Let's remove it !
        SET @Command = STUFF(@Command, CHARINDEX('WITH SCHEMABINDING', @Command), LEN('WITH SCHEMABINDING'), '');
        SET @Command = REPLACE(@Command, 'CREATE VIEW', 'ALTER VIEW');

        EXECUTE sp_executesql @Command
    END
END

और योजना बनाने के लिए:

CREATE PROCEDURE ViewAddSchemaBinding
    @ViewName VARCHAR(MAX)
AS
BEGIN
    DECLARE @PositionShemaBinding INT
    DECLARE @Command NVARCHAR(MAX)
    DECLARE @ObjectName VARCHAR(MAX)

    SELECT  @Command = OBJECT_DEFINITION(OBJECT_ID(@ViewName)),
            @ObjectName = OBJECT_NAME(OBJECT_ID(@ViewName));

    SET @PositionShemaBinding = PATINDEX('%WITH SCHEMABINDING%', @Command)

    IF @PositionShemaBinding = 0 BEGIN
        -- WITH SCHEMA BINDING IS NOT PRESENT... Let's add it !
        SET @Command = REPLACE(@Command, 'CREATE VIEW', 'ALTER VIEW');

        -- IF OBJECT NAME IS INTO BRAKETS, We need to handle it
       IF NOT CHARINDEX('[' + @ObjectName + ']', @Command) = 0 BEGIN
           SET @ObjectName = '[' + @ObjectName + ']'
       END

       SET @Command = STUFF(@Command, CHARINDEX(@ObjectName, @Command), LEN(@ObjectName), @ObjectName + ' WITH SCHEMABINDING ');

        EXECUTE sp_executesql @Command
    END
END

यह प्रदान किया जाता है "जैसा है" ...


2

ViewRemoveSchemaBinding का यह संस्करण तब भी काम करता है, जब इसे बनाया जाने के बाद से नाम बदल दिया गया हो। (समस्या यह है कि यदि दृश्य का नाम बदल दिया गया है, तो OBJECT_DEFINITION () अभी भी पुराने नाम का उपयोग करके एक परिभाषा लौटाएगा।)

CREATE PROCEDURE [dbo].[ViewRemoveSchemaBinding]
    @ViewName VARCHAR(MAX)
AS
BEGIN
    DECLARE @PositionShemaBinding INT
    DECLARE @Command NVARCHAR(MAX)

    SELECT @Command = OBJECT_DEFINITION(OBJECT_ID(@ViewName));
    SET @PositionShemaBinding = CHARINDEX('WITH SCHEMABINDING', @Command)

    IF NOT @PositionShemaBinding = 0 BEGIN
        SET @Command = 'ALTER VIEW ' + @ViewName + ' ' + RIGHT(@Command, LEN(@Command) - @PositionShemaBinding + 1);

        EXECUTE sp_executesql @Command
    END
END

ऐसा लगता है कि इसे चलाने के बाद नाम बदलने की समस्या दूर हो जाती है, और इसलिए ViewAddSchemaBinding को बदलने की आवश्यकता नहीं है ...।


1
यह काम नहीं करता है, क्योंकि कमांड में अभी भी 'विद स्कैमबाइंडिंग' है - इसे ठीक करने के लिए, इसके उपयोग को बदलें RIGHT:RIGHT(@Command, LEN(@Command) - (@PositionShemaBinding + LEN('WITH SCHEMABINDING')))
कोकवल्ला
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.