Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Entfernen Sie SCHEMABINDING aus einer Ansicht in SQL Server

Der Zweck der Schemabindung einer Ansicht besteht darin, sicherzustellen, dass die in der Ansicht referenzierten Basistabellen nicht in einer Weise geändert werden können, die sich auf die Ansichtsdefinition auswirken würde.

Das ist normalerweise eine gute Sache. Schließlich möchten Sie nicht, dass jemand vorbeikommt und einen Tisch fallen lässt, von dem Ihre Ansicht abhängt, oder?

Was aber, wenn Sie Änderungen an einer oder mehreren Tabellen vornehmen müssen, auf die Ihre Ansicht verweist?

In diesem Fall könnten Sie die Schemabindung aus einer Ansicht entfernen, die Änderungen an der/den Basistabelle/n vornehmen und dann die Schemabindung erneut anwenden.

Es gibt zwei Möglichkeiten, die Schemabindung aus einer Ansicht zu entfernen:

  • Ändern Sie die Ansicht so, dass ihre Definition keine Schemabindung mehr angibt.
  • Löschen Sie die Ansicht (erstellen Sie sie anschließend ohne Schemabindung neu, falls erforderlich).

Beispiel einer schemagebundenen Ansicht

Hier ist zunächst ein Beispiel für eine schemagebundene Ansicht:

CREATE VIEW dbo.v_Cats
WITH SCHEMABINDING
AS
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats;
GO

Wir wissen, dass es sich um eine schemagebundene Ansicht handelt, da sie WITH SCHEMABINDING enthält in seiner Definition. Um die Schemabindung zu entfernen, müssen wir nur dieses Bit entfernen.

Option 1 – Ansicht ändern

Um die Schemabindung aus dieser Ansicht zu entfernen, indem wir sie ändern, können wir den folgenden Code verwenden:

ALTER VIEW dbo.v_Cats
AS
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats;
GO

Wir haben lediglich CREATE geändert zu ALTER , und entfernen Sie WITH SCHEMABINDING .

Option 2 – Ansicht löschen

Hier ist ein Beispiel für das Löschen der Ansicht und das anschließende erneute Erstellen ohne Schemabindung:

DROP VIEW IF EXISTS dbo.v_Cats;
GO

CREATE VIEW dbo.v_Cats
AS
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats;
GO

In diesem Fall habe ich die DROP IF EXISTS-Syntax verwendet, die verhindert, dass ein Fehler auftritt, falls die Ansicht nicht existiert.