Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

No Oracle, é possível INSERT ou UPDATE um registro através de uma view?


Visualizações no Oracle podem ser atualizável sob condições específicas. Pode ser complicado e geralmente não é aconselhável.

Da Referência SQL do Oracle 10g:

Observações sobre visualizações atualizáveis

Uma exibição atualizável é aquela que você pode usar para inserir, atualizar ou excluir linhas da tabela base. Você pode criar uma exibição para ser inerentemente atualizável ou pode criar um gatilho INSTEAD OF em qualquer exibição para torná-la atualizável.

Para saber se e de que maneira as colunas de uma visão inerentemente atualizável podem ser modificadas, consulte a visão do dicionário de dados USER_UPDATABLE_COLUMNS. As informações exibidas por essa exibição são significativas apenas para exibições inerentemente atualizáveis. Para que uma visão seja inerentemente atualizável, as seguintes condições devem ser atendidas:
  • Cada coluna na exibição deve ser mapeada para uma coluna de uma única tabela. Por exemplo, se uma coluna de exibição for mapeada para a saída de uma cláusula TABLE (uma coleção não aninhada), a exibição não será inerentemente atualizável.
  • A visualização não deve conter nenhuma das seguintes construções:
    • Um operador de conjunto
    • um operador DISTINTO
    • Uma função agregada ou analítica
    • Uma cláusula GROUP BY, ORDER BY, MODEL, CONNECT BY ou START WITH
    • Uma expressão de coleção em uma lista SELECT
    • Uma subconsulta em uma lista SELECT
    • Uma subconsulta designada COM APENAS LEITURA
    • Juntas, com algumas exceções, conforme documentado no Oracle Database Administrator's Guide

Além disso, se uma exibição inerentemente atualizável contiver pseudocolunas ou expressões, você não poderá atualizar as linhas da tabela base com uma instrução UPDATE que se refira a qualquer uma dessas pseudocolunas ou expressões.

Se você deseja que uma visualização de junção seja atualizável, todas as condições a seguir devem ser verdadeiras:
  • A instrução DML deve afetar apenas uma tabela subjacente à junção.
  • Para uma instrução INSERT, a exibição não deve ser criada WITH CHECK OPTION e todas as colunas nas quais os valores são inseridos devem vir de uma tabela preservada por chave. Uma tabela preservada por chave é aquela para a qual cada chave primária ou valor de chave exclusivo na tabela base também é exclusivo na visualização de junção.
  • Para uma instrução UPDATE, todas as colunas atualizadas devem ser extraídas de uma tabela preservada por chave. Se a exibição foi criada WITH CHECK OPTION, as colunas de junção e as colunas retiradas de tabelas referenciadas mais de uma vez na exibição devem ser protegidas de UPDATE.
  • Para uma instrução DELETE, se a junção resultar em mais de uma tabela preservada por chave, o Banco de Dados Oracle excluirá da primeira tabela nomeada na cláusula FROM, independentemente de a exibição ter sido criada WITH CHECK OPTION.