Haruskah saya secara eksplisit MENYANGKAL PEMBARUAN ke kolom yang seharusnya tidak diperbarui?

25

Saya terbiasa bekerja di lingkungan yang sangat aman dan karenanya saya merancang izin saya hingga tingkat granularitas yang sangat baik. Satu hal yang biasanya saya lakukan adalah secara eksplisit DENYmenggunakan kemampuan UPDATEkolom yang seharusnya tidak pernah diperbarui.

Sebagai contoh:

create table dbo.something (
    created_by varchar(50) not null,
    created_on datetimeoffset not null
);

Dua kolom ini tidak boleh diubah begitu nilainya telah ditetapkan. Oleh karena itu saya akan secara eksplisit DENYdalam UPDATEizin pada mereka.

Baru-baru ini, selama pertemuan tim pengembang mengemukakan bahwa logika untuk memastikan bidang tidak pernah diperbarui harus dimuat dalam lapisan aplikasi dan bukan lapisan database jika "mereka perlu memperbarui nilai karena suatu alasan". Bagi saya itu kedengarannya seperti mentalitas dev yang khas (saya tahu, saya pernah menjadi mentalitas!)

Saya adalah arsitek senior di perusahaan saya dan saya selalu bekerja dengan prinsip paling sedikit hak istimewa yang diperlukan untuk membuat aplikasi berfungsi. Semua izin diaudit secara teratur.

Apa praktik terbaik dalam skenario ini?

Mr.Brownstone
sumber
Komentar diarsipkan .
Paul White mengatakan GoFundMonica

Jawaban:

28

Argumen itu tidak masuk akal. Saya selalu ingin kontrol dan kendala sedekat mungkin dengan data. Menempatkannya di lapisan aplikasi berarti itu hanya mempengaruhi orang-orang yang menggunakan lapisan aplikasi, dan juga mengasumsikan bahwa kode tersebut akan bebas bug dan keamanan di sekitar jalur kode itu akan tahan peluru. Itu adalah asumsi besar.

Jika mereka benar-benar perlu diperbarui, maka itu dapat dilakukan oleh seseorang yang tidak terpengaruh oleh eksplisit DENY, atau orang tersebut dapat sementara dipindahkan ke peran yang tidak terpengaruh, atau DENYdapat sementara dihapus. Ini adalah hal-hal yang mudah bagi Anda, sebagai DBA, untuk mengatur audit di sekitar. Dalam aplikasi? Tidak terlalu banyak.

Aaron Bertrand
sumber
16

Saya sepenuhnya setuju dengan @ Harun pada aspek teknis ini.

Di luar itu saya akan mengatakan, mengenai praktik terbaik:

  1. Mengingat bahwa adalah tugas / tanggung jawab DBA untuk melindungi data, pendekatan standar seharusnya adalah melakukan hal itu, seperti yang DBA anggap cocok, dan membutuhkan kasus bisnis yang kuat untuk melakukan perubahan. Sebuah hipotetis-potensi-masa-depan-agak-mungkin-diberikan-kondisi-tertentu-yang-akan-di-brainstormed-nanti-dan-dikonfirmasi-baik-setelah-itu-tapi-mungkin-berubah-nanti-atau-mungkin-tidak pernah Alasan sebenarnya terjadi (yaitu "karena alasan tertentu") tampaknya sedikit pembenaran, terutama ketika topik mengubah standar / praktik perusahaan.

  2. Jangan pernah mempercayai seseorang yang ingin membuat perubahan pada sesuatu yang seharusnya tidak pernah berubah ;-), (bahkan lebih lagi jika mereka bahkan tidak tahu mengapa mereka mau).

  3. Beri tahu pengembang bahwa mereka boleh menambahkan logika seperti itu ke kode aplikasi untuk mencegah pembaruan tersebut. Tapi, juga Anda tidak akan menghapus DENY. Jika / ketika hari itu tiba (dan itumungkin tidakmungkin tidak) bahwa seseorang mendapatkan kesalahan saat mencoba memperbarui salah satu kolom ini, maka Anda dapat berdiskusi tentang apakah Anda akan menghapus atau tidak DENY, yang akan membutuhkan pembenaran yang kuat dan aktual mengapa seseorang akan memperbarui nilai tersebut di tempat pertama.

    Poinnya adalah: harus ada kasus bisnis nyata yang mengarahkan orang-orang menghabiskan waktu mereka. Waktu sangat diminati tetapi persediaannya sedikit, sehingga Anda (dan semua orang) memiliki hal-hal yang lebih penting untuk dilakukan daripada mengubah sistem berdasarkan pendapat seseorang. Akan selalu ada berbagai pendapat (spasi vs tab, siapa pun?) Dan Anda bisa menghabiskan waktu bertahun-tahun untuk mengubah ini dan sebagainya jika pengembang itu pergi dan digantikan oleh orang yang sangat keberatan agar bidang tersebut dapat diperbarui. Jika tidak ada pelanggan yang meminta ini (atau sesuatu yang memerlukannya), dan tidak ada manfaat nyata (bahkan manfaat tertunda seperti membersihkan utang teknis, yang sulit untuk menunjukkan ROI, tetapi sangat bernilai - sementara mengingat bahwa peluang waktu yang dihabiskan tidak menghasilkan penghematan biaya aktual dalam jangka panjang tipis ke tidak ada), kemudian tutup permintaan atau taruh di backlog dengan prioritas rendah, bahkan dalam kasus-kasus di mana idealisme mengatakan bahwa itu harus diubah (ini bukan salah satu dari kasus-kasus itu, tetapi disebutkan untuk mereka yang berpikir bahwa itu adalah). Idealisme bagus untuk percakapan, tetapi perusahaan tidak dapat membayar sewa, utilitas, karyawan, pajak, dll dengan cita-cita.

  4. @ jpmc26 benar tentang perlunya komunikasi, tetapi tidak sepenuhnya benar tentang apa yang perlu dikomunikasikan. Ya, Anda harus mendengarkan apa yang orang lain minta dan berusaha memahami alasan mereka, yang mencakup mengajukan pertanyaan jika Anda tidak jelas tentang apa pun.

    NAMUN, basis data tidak tunduk pada aplikasi, dan profesional basis data (admin, insinyur, apa pun nama yang digunakan perusahaan Anda) tidak tunduk kepada pengembang (seperti yang tampaknya tersirat dalam jawaban itu). Anda tidak bekerja untuk pengembang, Anda bekerja untuk perusahaan, sama seperti mereka. Ini adalah upaya tim dan Anda tidak harus meminta maaf karena melakukan pekerjaan Anda. Yang mengatakan, kami tipe komputer tidak (umumnya) dikenal karena kemampuan komunikasi antar manusia kami, jadi, Anda benar-benar perlu memastikan bahwa orang lain memahami Anda , apa alasan Anda, apa tanggung jawab Anda, DAN bagaimana hal ini sebenarnya bekerja .

    Saya memasukkan bagian terakhir itu karena ada tingkat kesalahpahaman, informasi yang salah, dan kurangnya pengetahuan di luar sana (bahkan beberapa di sini, di halaman ini). Misalnya, tampaknya ada anggapan bahwa semua aturan adalah aturan bisnis. Kita perlu menjelaskan bahwa ada perbedaan antara aturan data dan aturan bisnis (@ Harun menyebutnya sebagai "batasan alur kerja vs batasan data" dalam komentar pada pertanyaan), dan bahwa sementara sebagian besar data secara alami adalah milik aplikasi, beberapa data sebenarnya milik model data. Haruskah DBA menentukan kepada pengembang bagaimana data aplikasi akan dibatasi? Tentu saja tidak. Adalah tugas kami untuk menawarkan bagaimana data aplikasi dapatdibatasi. Jika pelanggaran aturan bisnis yang terkait dengan data aplikasi dapat menyebabkan kerusakan, dan aplikasi bukanlah satu- satunya cara 100% untuk memanipulasi data, maka mungkin kendala pemeriksaan mungkin sangat membantu (dan mereka tidak sulit untuk mengubah atau menghapus ).

    TETAPI, datang dari arah lain, pengembang seharusnya tidak menentukan bagaimana data model data (yaitu meta-data) ditangani. Ini termasuk bidang audit (seperti kolom created_on/ created_by) dan kolom PK / FK (nilai-nilai ini hanya seharusnya diketahui secara internal dan tidak diberikan kepada pelanggan). Data ini bukan yang disimpan aplikasi tentang pelanggan (bahkan jika aplikasi dapat melihat nilai-nilai dan bahkan menggunakannya, seperti dengan ID), itu yang disimpan oleh model data tentang data aplikasi.

    Jadi masuk akal untuk menggunakan aturan data untuk melindungi data model data. Dan melakukannya tidak menyiratkan bahwa Anda akan mulai menambahkan kendala atau batasan pada data aplikasi. TETAPI, akan sulit untuk memajukan pembicaraan dengan cara yang benar-benar produktif jika perbedaan ini tidak dipahami.

Begitu:

  1. Ya, saya menyukai gagasan yang eksplisit DENYdi kolom audit, dan telah mengusulkan hal yang sama di tempat saya bekerja di masa lalu juga.
  2. Secara anekdot, saya memiliki percakapan yang sangat mirip dengan pengembang utama (yang sangat bagus), mungkin pada tahun 2000, ketika saya mulai menambahkan kunci asing. Dia berargumen (dengan sungguh-sungguh) bahwa itu tidak perlu over-engineering / idealisme (sesuatu seperti itu, sudah 17 tahun sejak percakapan itu) dan tidak sepadan dengan kinerja hit. Dia cukup jelas bahwa membersihkan data terkait harus ditangani di lapisan aplikasi. (ya, saya memang menambahkan FK karena dia tidak akan menjadi orang yang membersihkan data yatim yang akan dibuat oleh kodenya)

    Bertahun-tahun kemudian dia meminta maaf karena membuat argumen itu ;-)

Solomon Rutzky
sumber
7

Ini mungkin masalah XY. Pengembang mungkin tidak terlalu peduli dengan memblokir pembaruan ke bidang yang benar-benar konstan seperti created_on. Contoh khusus ini merupakan kendala yang sangat sederhana.

Pengembang mungkin khawatir bahwa tim DBA (yang termasuk Anda) berniat untuk menambahkan begitu banyak atau batasan yang rumit sehingga mulai menghambat kemampuan mereka untuk bekerja secara efektif, atau bahwa ketika sesuatu yang tidak biasa muncul atau sesuatu berubah, tim DBA akan menolak perubahan dan menghambat kemampuan tim pengembang untuk membuat kemajuan. Ini adalah keprihatinan yang relatif masuk akal. Birokrasi dan kehilangan kemampuan untuk mempengaruhi perubahan yang diperlukan adalah kejadian nyata, dan pengkodean terlalu banyak atau kendala kompleks dapat memiliki efek negatif pada kinerja dan pada kemampuan untuk menanggapi perubahan dalam persyaratan.

Pengembang mungkin bahkan tidak menyadari bahwa ini adalah sifat keprihatinan mereka. Mereka kemungkinan terbiasa memiliki pemerintahan bebas dari basis data, dan menyerahkan tingkat kebebasan itu sulit, terutama jika Anda tahu Anda tidak pernah menyalahgunakannya. Jadi rasa keprihatinan mereka tentang kehilangan kemampuan untuk melakukan apa yang mereka butuhkan bisa menjadi kabur dan tidak jelas.

Jadi ada beberapa hal yang harus Anda lakukan untuk meredakan ketakutan ini:

  1. Berkomunikasi berat dengan pengembang. Pastikan Anda memahami kebutuhan fitur yang mereka coba bangun, dan pastikan Anda responsif saat perubahan terjadi. Dengarkan apa yang mereka katakan, dan bekerja keras untuk menemukan solusi yang menyeimbangkan keprihatinan mereka dengan Anda. Bersedia membungkuk ketika mereka memiliki kebutuhan yang sah. Pastikan mereka tahu Anda sekutu dalam membangun perangkat lunak.
  2. Berhati-hatilah dalam membatasi. Pembatasan, bahkan yang dimaksudkan untuk memberikan integritas dan keamanan, dapat membuat lebih sulit untuk beradaptasi dengan perubahan atau menghadapi keadaan yang tidak terduga. Jadi, pahamilah bahwa setiap pembatasan yang Anda tambahkan kemungkinan memiliki biaya yang terkait dengannya karena kemungkinan akan menghemat biaya (dengan kemungkinan pengecualian kunci primer dan asing, yang hampir tidak memiliki kerugian). Yakinlah bahwa batasan yang Anda berikan benar-benar dibutuhkan atau bermanfaat.
  3. Saya tidak melihat tanda-tanda Anda melakukan ini, tetapi saya ingin menyebutkannya untuk pembaca lain: jangan melihat data atau database sebagai tanggung jawab Anda atau tim Anda. Data adalah aset bagi seluruh perusahaan. Tanpa sistem untuk menyimpannya (database) dan skrip, alat, atau aplikasi untuk membuat, memperbarui, dan mengambilnya, data tidak berharga. Karena setiap orang harus menggunakan aset ini, data adalah tanggung jawab semua orang. Basis data itu sendiri hanya satu bagian dari mendapatkan nilai dari data.
jpmc26
sumber
0

Anda memiliki pernyataan yang bertentangan

  • Kolom yang tidak boleh diperbarui
  • Mereka perlu memperbarui nilai untuk beberapa alasan

Apakah benar-benar terserah Anda untuk mendiktekan yang pertama?

Anda memberikan hak istimewa setidaknya untuk membuat aplikasi berfungsi tanpa bukti bahwa aplikasi tidak perlu memperbarui nilai.

Siapa yang bertanggung jawab atas integritas data?

Dengan kendala SQL, dapatkah Anda menjamin integritas data? Tidak, Anda tidak bisa karena sering ada aturan bisnis yang melampaui apa yang bisa dilakukan oleh basis data.

VendorID tidak boleh berubah tetapi bagaimana jika dua vendor bergabung. Jangan pernah bilang tidak akan pernah.

Jika tim aplikasi mencemari data dan mereka mengatakan mereka membutuhkan otoritas itu, itu ada di tangan mereka. Jika tim aplikasi bekerja untuk Anda, maka Anda dapat menentukan.

Pertanyaan yang tepat adalah apakah aplikasi harus memperbarui data.

paparazzo
sumber
3
tentang " Jika tim aplikasi mencemari data dan mereka mengatakan mereka membutuhkan otoritas itu maka itu pada mereka. " Um, apakah Anda pernah membawa pager dan dibangunkan pada jam 2:00 - 4:00 pagi karena ada yang salah? Anda tidak dapat menghubungi tim aplikasi pada pukul 2 pagi dan memberi tahu mereka untuk memperbaiki masalah mereka . Ini masalah DBA, karena tim aplikasi a) tidak tahu apa yang harus diperbaiki, b) tidak tahu cara memperbaikinya, dan c) tidak memiliki izin DB untuk memperbaikinya. Dan untuk pertanyaan yang diajukan pada akhirnya, pengembang tidak pernah mengatakan bahwa aplikasi harus memperbarui data; itu "mungkin suatu hari nanti aku mungkin ingin".
@SolomonRutzky Tidak akan berdebat dengan Anda. Jika didokumentasikan, maka tanggung jawab akan jatuh ke tangan otoritas. Tidak akan bermain permainan kata dengan Anda.
paparazzo
2
Saya setuju dengan Anda pada prinsip bahwa "tanggung jawab berjalan bersama otoritas". Tapi itu bukan kenyataan bagi banyak orang. Saya telah berdebat untuk cita-cita itu di tempat-tempat yang telah saya kerjakan. Saya jarang melihatnya terjadi. Selain itu, ini bukan argumen, ini diskusi.
Solomon Rutzky
@SolomonRutzky Kecuali jika ini adalah masalah yang berdampak pada setiap aplikasi pada basis data seseorang dari tim aplikasi (atau pengembang) harus memiliki pengetahuan dan izin untuk memperbaiki masalah tersebut. Tidak ada alasan mengapa tim DBA harus bertanggung jawab atas masalah dengan masalah yang ada pada level aplikasi dan bukan pada level database.
Joe W
1
@ JoW, saya minta maaf jika kata-kata saya tidak jelas. Saya berbicara secara khusus tentang masalah dalam database yang a) disebabkan oleh masalah pada lapisan aplikasi yang bisa dicegah dengan penggunaan fitur database yang tepat, dan b) tidak dapat diperbaiki oleh non-DBA karena masalahnya (bukan penyebabnya) adalah sekarang dalam data. Dan (mudah-mudahan) tidak lazim bagi pengembang untuk memiliki akses jangkauan penuh ke DB Produksi, dan itu bahkan tidak mempertimbangkan skenario di mana sys admin diperlukan.
Solomon Rutzky