ビューを再作成せずにSCHEMABINDINGをオフにするにはどうすればよいですか?


回答:


11

はい。SCHEMABINDINGを使用するのは良いことであり(常に使用します)、時には依存オブジェクトを変更するために削除する必要があります。ビューを変更するだけです

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

私もそうしましたが、他のオブジェクト(関数、ビュー)がこのオブジェクトに依存する場合があります。そのため、このフラグを一時的にマーク/マーク解除するとよいでしょう:)。ですから、dbの現在のバージョンでは不可能ですよね?
ガリック

@garik:正しい、私は同じ問題を抱えています。各依存オブジェクトでALTERを実行します... SQL Serverはいつでもルールを実施します。これは不整合につながるため、「スイッチオフ」できません
-gbn

8

ALTER VIEWを使用すると、これを実行できませんか?ビューを作成するときに、次のことを行います。

CREATE VIEW
WITH SCHEMABINDING
AS
SELECT stmt
GO

そのため、WITH句を失います:

ALTER VIEW viewname
AS
SELECT stmt
GO

MSDNのALTER VIEWを参照してください


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

SCHEMABINDINGを配置するには:

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
これは、コマンドとしてではない作業は、まだ「SCHEMABINDING WITH」が含まれない-の使用変更、それを修正するRIGHTには:RIGHT(@Command, LEN(@Command) - (@PositionShemaBinding + LEN('WITH SCHEMABINDING')))
Cocowalla
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.