it-swarm.com.de

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

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

22
garik

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

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

Wird ALTER VIEW es Ihnen nicht ermöglichen, dies zu erledigen? Wenn Sie eine Ansicht erstellen, gehen Sie wie folgt vor:

CREATE VIEW
WITH SCHEMABINDING
AS
SELECT stmt
GO

verlieren Sie also die WITH-Klausel:

ALTER VIEW viewname
AS
SELECT stmt
GO

Siehe ALTER VIEW auf MSDN

7
SQLRockstar

Nachdem ich mich stundenlang umgesehen hatte, erstellte ich dafür 2 gespeicherte Prozesse. 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 auszudrücken:

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 es ist" bereitgestellt ...

6
boblemar

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

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 nach dem Ausführen dieses Problems das Umbenennungsproblem behoben ist und ViewAddSchemaBinding nicht geändert werden muss.

2
David Roodman