Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Remover SCHEMABINDING de uma exibição no SQL Server


A finalidade de vincular um esquema a uma exibição é garantir que as tabelas base referenciadas na exibição não possam ser modificadas de uma forma que afete a definição da exibição.

Isso normalmente é uma coisa boa. Afinal, você não quer alguém vindo e derrubando uma mesa da qual sua visão depende, não é?

Mas e se você precisar fazer alterações em uma ou mais tabelas referenciadas pela sua visão?



Nesse caso, você pode remover a vinculação de esquema de uma exibição, fazer as alterações na(s) tabela(s) base e reaplicar a vinculação de esquema.

Há duas maneiras de remover a vinculação de esquema de uma visualização:
  • Altere a visualização para que sua definição não especifique mais a vinculação de esquema.
  • Retire a visualização (em seguida, recrie-a sem vinculação de esquema, se necessário).

Exemplo de uma visualização vinculada ao esquema


Primeiro, aqui está um exemplo de uma visualização vinculada ao esquema:
CREATE VIEW dbo.v_Cats
WITH SCHEMABINDING
AS
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats;
GO

Sabemos que é uma visualização vinculada ao esquema porque contém WITH SCHEMABINDING em sua definição. Para remover a ligação de esquema, tudo o que precisamos fazer é remover esse bit.

Opção 1 – Alterar a visualização


Para remover a vinculação de esquema dessa visualização alterando-a, podemos usar o seguinte código:
ALTER VIEW dbo.v_Cats
AS
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats;
GO

Tudo o que fizemos foi alterar CREATE para ALTER , e remova WITH SCHEMABINDING .

Opção 2 – Abandone a visualização


Aqui está um exemplo de como descartar a exibição e recriá-la sem vinculação de esquema:
DROP VIEW IF EXISTS dbo.v_Cats;
GO

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

Nesse caso, usei a sintaxe DROP IF EXISTS, que evita que ocorra um erro caso a view não exista.