mengapa orang disarankan untuk tidak memperbarui melalui tampilan

8

Selama Perguruan tinggi, kami terbentur dalam benak kami untuk tidak memperbarui tabel melalui tampilan, dan lagi ketika saya masuk ke tempat kerja kami di mana diberitahu tidak memperbarui database melalui tampilan.

Di mana ada / Apakah ada implikasi kinerja yang signifikan untuk melakukan ini? Atau apakah ini lebih merupakan kasus pengembang senior / DBA yang memberi tahu staf junior untuk tidak melakukan ini karena mereka tanpa disadari dapat mendatangkan malapetaka dengan bergabung secara tidak benar.

EDIT
Saya menggunakan MSSQL 2000-2008 (Tergantung pada rincian klien)

Tim Sparg
sumber
DBMS mana yang Anda gunakan?
a_horse_with_no_name
@a_horse_with_no_name Diperbarui untuk mengindikasikan DBMS. Saya berharap jawabannya akan cukup umum di semua DBMS. Apakah saya naif?
Tim Sparg
Apakah Anda berbicara tentang pandangan yang secara alami dapat diperbarui atau pandangan yang Anda harus menulis INSTEAD OFpemicu? Saya belum pernah mendengar saran ini terutama BTW apakah Anda tidak pernah diberi alasan?
Martin Smith
@TimSparg: itu tergantung pada bagaimana tampilan dibuat dapat diupdate. Jika instead ofpemicu digunakan, maka tidak ada ambiguitas dan saya tidak melihat alasan untuk tidak menggunakannya. Tapi saya tidak begitu terbiasa dengan SQL Server jadi saya tidak bisa mengomentari menggunakan tampilan tanpa pemicu.
a_horse_with_no_name
@ Martin Smith saya sedang berbicara tentang pandangan yang dapat diperbarui secara alami. Samar-samar saya diberitahu bahwa ada kesulitan dan masalah kinerja, ini kemudian diperkuat di tempat kerja saya jika kami dengan tegas diberitahu untuk tidak memperbarui melalui pandangan. Saya mulai berpikir bahwa itu hanya sesuatu yang Devs / DBA senior akan katakan karena mereka tidak merasa ingin menjelaskan untuk berhati-hati memperbarui melalui pandangan (IE dalam vs luar bergabung)
Tim Sparg

Jawaban:

10

Agar tampilan dapat diupdate tanpa menggunakan INSTEAD OFpemicu "SQL Server harus dapat melacak modifikasi dari definisi tampilan menjadi satu tabel dasar." .

Tidak ada kerugian kinerja untuk Memperbarui Tampilan ini karena SQL Server hanya akan menghasilkan rencana kueri untuk tabel dasar yang terpengaruh. Salah satu kelemahan yang mungkin terjadi adalah menambahkan lapisan kebingungan jadi kecuali jika Anda menggunakan Views sebagai lapisan keamanan, lebih jelas untuk hanya menulis kode yang memperbarui tabel dasar secara langsung.

Yang lain mungkin jika tampilan berisi satu ke banyak JOINdan Anda memperbarui sisi "satu" dengan nilai dari sisi "banyak" itu tidak pasti hasil apa yang Anda dapatkan, tetapi hal yang sama berlaku untuk UPDATE ... FROMsintaks kepemilikan SQL Server . Anda perlu menggunakan MERGEatau kueri sub skalar yang dikorelasikan untuk menghindari kemungkinan masalah ini.

Untuk Tampilan yang tidak dapat diupdate dan memerlukan INSTEAD OFpemicu ada implikasi kinerja karena tabel pseudo inserteddan deletedperlu dihasilkan dari tabel dasar sehingga jika mungkin memperbarui tabel dasar secara langsung kemungkinan akan lebih efisien.

Martin Smith
sumber