por que as pessoas são aconselhadas a não atualizar através de visualizações

8

Durante a faculdade, foi um golpe em nossas cabeças não atualizar tabelas através de visualizações e, novamente, quando cheguei no local de trabalho, informamos que não atualizávamos o banco de dados através de visualizações.

Onde / Existem implicações significativas de desempenho para fazer isso? Ou esse é mais um caso de desenvolvedores seniores / DBAs que dizem aos funcionários juniores para não fazerem isso porque podem causar estragos involuntariamente com uma associação incorreta.

EDIT
Estou usando o MSSQL 2000-2008 (Dependendo dos detalhes do cliente)

Tim Sparg
fonte
Qual DBMS você está usando?
A_horse_with_no_name
@a_horse_with_no_name Atualizado para indicar DBMS. Eu esperava que a resposta fosse bastante genérica em todos os DBMSs. Eu estava sendo ingênuo?
Tim Sparg
Você está falando sobre visualizações naturalmente atualizáveis ​​ou para as quais você precisaria escrever um INSTEAD OFgatilho? Eu não ouvi esse conselho, particularmente BTW, você nunca deu um motivo?
Martin Smith
@ TimSparg: depende de como a visualização é atualizável. Se os instead ofgatilhos são usados, não há ambiguidade e não vejo uma razão para não usá-los. Mas como eu não estou familiarizado com o SQL Server, não posso comentar sobre o uso de modos de exibição sem um gatilho.
A_horse_with_no_name
@ Martin Smith Estou falando de visualizações naturalmente atualizáveis. Foi-me dito vagamente que existem armadilhas e problemas de desempenho; isso foi reforçado no meu local de trabalho onde estávamos firmemente instruídos a não atualizar por meio de visualizações. Estou começando a pensar que era apenas algo que os Devs / DBAs seniores diriam porque não tinham vontade de explicar para ter cuidado com a atualização através de visualizações (junção interna versus externa do IE)
Tim Sparg

Respostas:

10

Para uma exibição ser atualizável sem o uso de INSTEAD OFgatilhos "O SQL Server deve ser capaz de rastrear de maneira inequívoca as modificações da definição de exibição em uma tabela base". .

Não há desvantagem de desempenho em Atualizar essas exibições, pois o SQL Server gera apenas um plano de consulta para a tabela base afetada. Uma possível desvantagem pode ser o fato de adicionar uma camada de ofuscação; portanto, a menos que você esteja usando o Views como uma camada de segurança, é mais fácil escrever apenas um código que atualize a tabela base diretamente.

Outro pode ser se o modo de exibição contiver um para muitos JOINe você atualizar o lado "um" com um valor do lado "muitos"; é indeterminado qual o resultado final, mas o mesmo se aplica à UPDATE ... FROMsintaxe proprietária do SQL Server . Você precisaria usar MERGEou uma subconsulta escalar correlacionada para evitar esse possível problema.

Para modos de INSTEAD OFexibição que não são atualizáveis ​​e exigem um acionador, há implicações de desempenho, pois as tabelas insertede deletedpseudo-tabelas precisam ser geradas a partir da tabela base, portanto, se possível, a atualização direta das tabelas base provavelmente será mais eficiente.

Martin Smith
fonte