Modificando dados por meio de uma exibição

É possível modificar os dados de uma tabela base subjacente por meio de uma exibição, do mesmo modo como os dados são modificados em uma tabela usando instruções UPDATE, INSERT e DELETE ou usando o utilitário bcp e a instrução BULK INSERT. No entanto, as seguintes restrições são aplicadas para atualizar exibições, mas não são aplicadas a tabelas:

ObservaçãoObservação

Algumas das restrições a seguir não se aplicam a exibições particionadas, e nenhuma delas se aplica a atualizações feitas por meio de gatilhos INSTEAD OF. Para obter mais informações, consulte "Outras opções para modificar dados por meio de exibições", posteriormente neste tópico.

  • Todas as modificações, inclusive as instruções UPDATE, INSERT e DELETE, devem referenciar colunas de apenas uma tabela base.

  • As colunas sendo modificadas na exibição devem referenciar diretamente os dados subjacentes das colunas da tabela. Eles não podem ser derivados de nenhum outro modo, como através de:

    • Uma função de agregação (AVG, COUNT, SUM, MIN, MAX, GROUPING, STDEV, STDEVP, VAR e VARP).

    • Uma computação; a coluna não pode ser computada de uma expressão que utiliza outras colunas. As colunas formadas com o uso de operadores de conjunto (UNION, UNION ALL, CROSSJOIN, EXCEPT e INTERSECT) somam em uma computação e também não são atualizáveis.

  • As colunas sendo modificadas não podem ser afetadas por cláusulas GROUP BY, HAVING ou DISTINCT.

  • TOP não pode ser usado em nenhum lugar no select_statement da exibição quando WITH CHECK OPTION também for especificado.

As restrições anteriores aplicam-se a todas as subconsultas da cláusula FROM da exibição, exatamente como se aplicam à própria exibição. Em geral, o SQL Server é capaz de rastrear precisamente as modificações da definição da exibição em uma tabela base. Por exemplo, a exibição a seguir não é atualizável:

USE AdventureWorks2008R2;
GO
CREATE VIEW Sales.TotalSalesContacts
AS
    SELECT p.LastName, 
           SUM(o.TotalDue) AS TotalSales
    FROM Sales.SalesOrderHeader AS o, Person.Person AS p
    WHERE p.BusinessEntityID = o.CustomerID
    GROUP BY LastName;

Uma modificação feita na coluna LastName de TotalSalesContacts seria inaceitável porque a coluna teria sido afetada por uma cláusula GROUP BY. Se houver mais de uma instância do mesmo sobrenome, o SQL Server não saberá qual atualizar, inserir ou excluir. Da mesma forma, uma tentativa de modificar a coluna TotalSales de TotalSalesContacts retornaria um erro porque se trata de uma coluna derivada de uma função de agregação. O SQL Server não pode rastrear essa coluna diretamente em sua tabela base, SalesOrderHeader.

As diretrizes adicionais a seguir se aplicam:

  • Todas as instruções de modificações de dados executadas na exibição devem atender o conjunto de critérios da instrução SELECT, definindo a exibição caso a cláusula WITH CHECK OPTION tiver sido usada na definição da exibição. Se a cláusula WITH CHECK OPTION tiver sido usada, as linhas não poderão ser modificadas de forma que elas desapareçam da exibição. Toda modificação que causa isso é cancelada e um erro é exibido.

  • As instruções INSERT precisam especificar valores para todas as colunas da tabela subjacente que não permitem valores nulos e que não tenham definições DEFAULT.

  • Os dados modificados nas colunas da tabela subjacente precisam atender as restrições dessas colunas, como nulabilidade, restrições, definições DEFAULT, entre outras coisas. Por exemplo, se uma linha for excluída, todas as restrições subjacentes FOREIGN KEY nas tabelas relacionadas precisarão ser atendidas para que a exclusão tenha êxito.

  • Uma exibição de partição distribuída (exibição remota) não pode ser atualizada usando-se um cursor controlado por conjunto de chaves. Essa restrição pode ser resolvida declarando-se o cursor nas tabelas subjacentes e não na própria exibição.

  • Não há suporte para a importação de dados em uma exibição particionada por bcp ou por BULK INSERT e INSERT ... SELECT * FROM OPENROWSET(BULK...) . Entretanto, é possível inserir várias linhas em uma exibição particionada usando uma instrução INSERT. Para obter mais informações, consulte Exportação ou importação de dados em massa para uma exibição.

  • Não podem ser usadas as instruções READTEXT e WRITETEXT com text, ntextou com colunas image em uma exibição.

Outras opções para modificar dados por meio de uma exibição

Se as restrições descritas anteriormente neste tópico impediram a modificação de dados direta através de uma exibição, considere as seguintes opções:

  • Use gatilhos INSTEAD OF com lógica para oferecer suporte às instruções INSERT, UPDATE e DELETE. Para obter mais informações, consulte Criando gatilhos INSTEAD OF.

  • Use exibições particionadas atualizáveis que modificam uma ou mais tabelas membro. Para obter mais informações, consulte Criando exibição particionadas.

Para adicionar dados através de uma exibição

Para alterar dados através de uma exibição

Para excluir dados através de uma exibição

Consulte também

Conceitos