Apakah menyimpan pernyataan SQL dalam tabel MySQL untuk mengeksekusi nanti adalah ide yang buruk? Pernyataan SQL akan siap untuk dieksekusi, misalnya tidak akan ada parameter untuk bertukar atau apa pun, misalnya DELETE FROM users WHERE id=1
.
Saya kira saya sedang malas, tetapi saya memikirkan ide ini karena saya sedang mengerjakan proyek yang akan membutuhkan beberapa pekerjaan cron yang akan mengeksekusi pernyataan SQL secara berkala.
Jawaban:
Aman, jika itu yang Anda tanyakan. Selama Anda berhati-hati tentang keamanan Anda seperti halnya dengan keamanan data Anda.
Tapi jangan menemukan kembali roda, Prosedur Tersimpan ADALAH bit SQL yang disimpan dalam sebuah tabel. Dan mereka mendukung, bahkan mendorong, parameterisasi.
Perhatikan juga, Anda dapat membuat keamanan Anda lebih sederhana DAN mengurangi jumlah titik kegagalan DAN mengurangi komunikasi jaringan dengan menggunakan Penjadwal Acara MySql alih-alih cron.
Database lain memiliki padanan dengan ini, untuk alasan yang baik. Anda bukan yang pertama yang membutuhkan fungsionalitas ini.
sumber
Jika Anda ingin menyimpan pernyataan SQL dalam database untuk eksekusi nanti, ada opsi yang lebih baik daripada meletakkannya di tabel: gunakan fungsionalitas bawaan yang disediakan untuk tujuan khusus ini. Masukkan mereka dalam prosedur tersimpan.
sumber
Tidak, saya akan mengatakan itu bukan ide yang baik.
Ini berarti setiap permintaan / pembaruan "nyata" akan membutuhkan 2 klik pada basis data - satu untuk mendapatkan permintaan / pembaruan "nyata", dan satu untuk menjalankannya.
Ini mungkin bukan masalah besar dalam sistem yang kecil, tetapi semakin banyak pengguna / transaksi yang didapat sistem Anda, semakin kecil skalanya.
Saya kira ini berasal dari mencari alternatif untuk menanamkan SQL dalam kode Anda?
Meringkas SQL dalam prosedur tersimpan seperti yang disarankan Mason Wheeler, akan menjadi salah satu cara yang jauh lebih baik daripada ide ini.
sumber
Maaf, menurut saya itu bukan ide yang bagus.
Pertimbangkan kasus di mana tabel yang dimaksud berubah. Katakanlah kolom id Anda diganti namanya menjadi new_id .
Seperti halnya perubahan itu sendiri, ada versi kode Anda yang ditulis untuk vintage lama dari database yang mungkin tidak lagi berjalan. Tentu, Anda mungkin tahu memeriksa di tabel kode tetapi tidak segera jelas untuk orang lain.
Untuk perubahan seperti yang telah saya jelaskan, saya biasanya melihat file SQL mandiri, prosedur tersimpan, pemicu, in-line SQL dalam kode klien (VB, C #, C ++ dll) tetapi tempat terakhir yang saya pikir harus dicari adalah ada di tabel database. Meskipun mungkin aku akan sekarang! :)
sumber
Ada alasan yang sah untuk menyimpan SQL dalam sebuah tabel. Perangkat lunak yang bekerja dengan saya di tempat kerja sekarang mencakup sistem untuk menghasilkan dokumen dan dokumen perlu menyertakan perhitungan yang cukup rumit menggunakan data dalam database. Dokumen-dokumen sering diperbarui, sering berbeda secara signifikan dalam hal data yang dibutuhkan, dan perhitungan yang perlu dilakukan. SQL pada dasarnya digunakan sebagai bahasa scripting untuk melakukan perhitungan ini dan SQL disimpan dalam tabel yang juga menyimpan info lain untuk dokumen-dokumen ini. Orang-orang yang memelihara dokumen-dokumen itu bukan programmer atau DBA, tetapi mereka akrab dengan skema database dan mereka mahir dengan SQL. Ini akan menjadi overhead yang signifikan bagi mereka untuk mempertahankan kode SQL dalam bentuk prosedur tersimpan.
Untuk apa yang Anda jelaskan - "... proyek yang akan membutuhkan beberapa pekerjaan cron yang akan mengeksekusi pernyataan SQL secara berkala" - jawaban lain mungkin benar dalam menyarankan bahwa Anda menggunakan prosedur store, atau yang setara, untuk DBMS yang Anda miliki. sedang menggunakan.
Kriteria yang baik untuk memutuskan apakah masuk akal untuk menyimpan SQL dalam tabel versus dalam prosedur tersimpan menentukan siapa yang akan mempertahankan SQL itu. Jika pengguna mempertahankan SQL itu, yaitu mereka menulisnya dan mengubahnya kapan pun mereka mau, maka mungkin baik-baik saja, dan memang yang terbaik, untuk menyimpan SQL itu dalam sebuah tabel. Jika pengembang akan mempertahankan SQL itu, maka SQL harus disimpan dalam bentuk yang dapat diperbarui oleh prosedur pengembangan dan penerapan (semoga otomatis), misalnya disimpan sebagai objek seperti prosedur tersimpan dalam database itu sendiri.
sumber
Jalan keluar yang mudah adalah dengan memiliki .ini atau file rasa konfigurasi lain untuk menyimpan kueri. Dengan cara ini Anda dapat memilikinya di satu tempat, mengubah apa pun tanpa harus mengakses database untuk melakukannya, tidak menekan database berkali-kali. dan juga Anda mungkin ingin / memerlukan suatu titik untuk menggunakan parameter atau menambahkan kondisi ke pertanyaan Anda (tambahkan dengan hal-hal yang lebih kompleks untuk kasus tertentu dalam kode Anda).
Tentu saja Anda dapat menyimpannya di level basis data (baik dalam tabel atau, lebih baik lagi, sebagai prosedur tersimpan), namun jika Anda malas seperti saya ;-) tetapi juga mementingkan kinerja, file .ini, dan PHP Metode parse_ini tercinta untuk membacanya, adalah cara untuk melakukannya (jika Anda menggunakan bahasa pemrograman lain, Anda sendiri yang mencari tahu pendekatan serupa)! Biasanya saya akan membaca file ini di aplikasi bootloader dan menyimpannya di objek statis (mungkin dengan lapisan cache di atas) untuk mempercepat hal-hal jika kita berbicara tentang sejumlah besar pertanyaan yang berbeda.
sumber
Jika Anda hanya memerlukan pernyataan SQL satu kali, misalnya, jika Anda mengantri banyak operasi untuk dilakukan selama di luar jam kerja, maka ya, memasukkannya ke dalam tabel akan bekerja dengan baik.
Jika Anda perlu menjalankan pernyataan SQL yang sama pada interval yang ditentukan, maka rute prosedur tersimpan yang disebutkan orang lain kemungkinan merupakan pilihan yang lebih baik untuk Anda.
Yang mengatakan, apa yang Anda tanyakan adalah hal yang tidak biasa, dan mungkin merupakan indikasi beberapa masalah lain. Misalnya, jika Anda menunggu untuk menghapus pengguna dari database, mungkin lebih baik untuk memanggil skrip terjadwal yang melakukan operasi melalui kode aplikasi Anda, daripada mencatat pernyataan SQL yang sebenarnya. Dengan cara ini SQL dan kode tidak pernah tidak sinkron.
sumber