আমি কীভাবে পুনরায় তৈরি না করে কোনও দৃশ্যের জন্য স্কেমব্যান্ডিংটি স্যুইচ করব?


21

আমি SCHEMABINDINGকোন দৃশ্য পুনরায় না তৈরি করে কীভাবে স্যুইচ করব ?

উত্তর:


11

হ্যাঁ. এটি ভাল যে আপনি স্কেমবাইন্ডিং ব্যবহার করেন (আমরা সবসময় করি) এবং কখনও কখনও আপনাকে কোনও নির্ভরযোগ্য অবজেক্ট পরিবর্তন করতে এটি সরিয়ে ফেলতে হয়। শুধু ALTER দৃশ্য

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

আমিও তাই করেছি, তবে কখনও কখনও অন্যান্য বস্তু (ফাংশন, দর্শন) এটির উপর নির্ভর করে। তাই এই পতাকাটিকে একটি সময়ের জন্য চিহ্নিত / চিহ্নমুক্ত করা ভাল হবে :)। সুতরাং এটি ডিবি বর্তমান সংস্করণে অসম্ভব, হ্যাঁ?
গারিক

@garik: সঠিক, আমারও একই সমস্যা আছে। প্রতিটি নির্ভরশীল বস্তুর উপর ALTER চালান ... যেকোন সময় এসকিউএল সার্ভার নিয়মগুলি কার্যকর করবে: আপনি "স্যুইচ অফ" করতে পারবেন না কারণ এটি অসঙ্গতি হতে পারে
gbn

8

বিকল্পটি কী আপনাকে এই কাজটি করার অনুমতি দেবে না? আপনি যখন একটি ভিউ তৈরি করেন আপনি তা করবেন:

CREATE VIEW
WITH SCHEMABINDING
AS
SELECT stmt
GO

সুতরাং, দফাটি সহ হারাবেন:

ALTER VIEW viewname
AS
SELECT stmt
GO

দেখুন দুটিই MSDN alter চালু দেখুন


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

ভিউআরমোভেচেমি বাইন্ডিংয়ের এই সংস্করণটি দৃশ্যটি তৈরি করার পর থেকে নতুন নামকরণ করা হলেও তা কাজ করে। (সমস্যাটি হ'ল যদি ভিউটির নতুন নামকরণ করা হয়, তবে 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

দেখে মনে হচ্ছে এটি চালানোর পরে পুনরায় নামকরণের সমস্যাটি চলে যায় এবং সুতরাং ভিউএডডসচেমাবাইন্ডিংয়ের কোনও পরিবর্তন করার দরকার নেই ....


1
এটি কাজ করে না, কারণ কমান্ডটিতে এখনও 'উইথ স্কাইমবাইন্ডিং' রয়েছে - এটি ঠিক করার জন্য, এর ব্যবহারটি পরিবর্তন করুন RIGHT:RIGHT(@Command, LEN(@Command) - (@PositionShemaBinding + LEN('WITH SCHEMABINDING')))
কোকোয়াল্লা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.