Як вимкнути SCHEMABINDING для перегляду, не відтворюючи його?


Відповіді:


11

Так. Добре, що ви використовуєте SCHEMABINDING (ми це робимо завжди), а іноді вам доведеться видалити його, щоб змінити залежний об'єкт. Просто ПІСЛЯ перегляду

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

так я і зробив, але іноді інші об'єкти (функції, види) залежать від цього. Тож добре буде на час позначити / відмітити цей прапор :). Так що в поточній версії db це неможливо, так?
garik

@garik: правильно, у мене така ж проблема. Запустити ALTER на кожному залежному об'єкті ... У будь-який момент часу SQL Server буде застосовувати правила: ви не можете "вимкнути", оскільки це призведе до непослідовності
gbn

8

Чи не дозволить ВІДПОВІДНОГО ВИГУТУ вам зробити це? Створюючи подання, ви зробите це:

CREATE VIEW
WITH SCHEMABINDING
AS
SELECT stmt
GO

Отже, втрачайте пункт З:

ALTER VIEW viewname
AS
SELECT stmt
GO

Див. ALTER VIEW на 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')))
Cocowalla
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.