Wie schalte ich SCHEMABINDING für eine Ansicht aus, ohne sie neu zu erstellen?

Antworten:

11

Ja. Es ist gut, dass Sie SCHEMABINDING verwenden (wir tun es immer) und manchmal müssen Sie es entfernen, um ein abhängiges Objekt zu ändern. ÄNDERN Sie einfach die Ansicht

ALTER VIEW myView
--Remove this WITH SCHEMABINDING
AS
SELECT ...
GO
gbn
quelle
Ich auch, aber manchmal hängen andere Objekte (Funktionen, Ansichten) von diesem ab. Es wird also gut sein, diese Flagge eine Zeit lang zu markieren / zu entfernen :). Also ist es in der aktuellen Version von db unmöglich, ja?
Garik
@garik: richtig, ich habe das gleiche problem. Führen Sie ALTER für jedes abhängige Objekt aus ... SQL Server erzwingt zu jedem Zeitpunkt die Regeln: Sie können nicht "ausschalten", da dies zu Inkonsistenzen führen würde
gbn
8

Erlauben Sie ALTER VIEW nicht, dies zu erledigen? Wenn Sie eine Ansicht erstellen, tun Sie Folgendes:

CREATE VIEW
WITH SCHEMABINDING
AS
SELECT stmt
GO

Verliere also die WITH-Klausel:

ALTER VIEW viewname
AS
SELECT stmt
GO

Siehe ALTER VIEW auf MSDN

SQLRockstar
quelle
5

Nachdem ich mich stundenlang umgesehen hatte, erstellte ich 2 gespeicherte Proc. Hoffe das hilft jemandem

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

Und um das SCHEMABINDING zu formulieren:

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

Es wird "wie besehen" zur Verfügung gestellt ...

Edelmann
quelle
2

Diese Version von ViewRemoveSchemaBinding funktioniert auch dann, wenn die Ansicht seit ihrer Erstellung umbenannt wurde. (Das Problem ist, dass OBJECT_DEFINITION () immer noch eine Definition mit dem alten Namen zurückgibt, wenn die Ansicht umbenannt wurde.)

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

Es scheint, dass das Umbenennungsproblem nach dem Ausführen weg ist, sodass ViewAddSchemaBinding nicht geändert werden muss ....

David Roodman
quelle
1
Dies funktioniert nicht, da der Befehl noch 'WITH SCHEMABINDING' enthält. Ändern Sie die Verwendung von RIGHTzu:RIGHT(@Command, LEN(@Command) - (@PositionShemaBinding + LEN('WITH SCHEMABINDING')))
Cocowalla