Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Rimuovere SCHEMABINDING da una vista in SQL Server

Lo scopo dell'associazione dello schema a una vista è garantire che le tabelle di base a cui si fa riferimento nella vista non possano essere modificate in modo tale da influire sulla definizione della vista.

Questa è normalmente una buona cosa. Dopotutto, non vuoi che qualcuno arrivi e lasci cadere un tavolo da cui dipende la tua vista, vero?

Ma cosa succede se devi apportare modifiche a una o più tabelle a cui fa riferimento la tua vista?

In questo caso, puoi rimuovere l'associazione dello schema da una vista, apportare le modifiche alla/e tabella/e di base, quindi riapplicare l'associazione dello schema.

Esistono due modi per rimuovere l'associazione dello schema da una vista:

  • Modifica la vista in modo che la sua definizione non specifichi più l'associazione dello schema.
  • Elimina la vista (quindi ricreala senza l'associazione dello schema, se necessario).

Esempio di vista associata a uno schema

Innanzitutto, ecco un esempio di vista associata a uno schema:

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

Sappiamo che è una vista legata allo schema perché contiene WITH SCHEMABINDING nella sua definizione. Per rimuovere il binding dello schema, tutto ciò che dobbiamo fare è rimuovere quel bit.

Opzione 1 – Modifica la visualizzazione

Per rimuovere l'associazione dello schema da questa vista alterandola, possiamo utilizzare il codice seguente:

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

Tutto quello che abbiamo fatto è stato cambiare CREATE a ALTER e rimuovi WITH SCHEMABINDING .

Opzione 2:elimina la vista

Ecco un esempio di eliminazione della vista, quindi ricreazione senza associazione dello schema:

DROP VIEW IF EXISTS dbo.v_Cats;
GO

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

In questo caso, ho utilizzato la sintassi DROP IF EXISTS, che impedisce il verificarsi di un errore nel caso in cui la vista non esistesse.