Salah satu pengembang saya telah menulis fungsi SQL yang berfungsi seperti fungsi VB.Net (LastIndexOf) dan ingin menerbitkannya. Pertanyaan saya adalah apa yang menjadi alasan untuk meletakkan ini di basis data pusat dibandingkan meletakkannya di setiap basis data pengguna?
Pengembang sedang mencoba untuk memasukkannya ke dalam skema sys pada master db-nya sehingga ia tidak harus memenuhi syarat panggilan dari basis data pengguna ... sigh
Tapi saya tidak yakin apa alasan valid untuk memusatkannya (jelas bukan master database) versus setiap basis data pengguna?
sql-server
performance
functions
ddl
David George
sumber
sumber
Jawaban:
Cara saya lebih suka melakukan ini: menempatkan fungsi dalam database utilitas, dan membuat sinonim untuknya di setiap database biasa. Dengan cara ini Anda mendapatkan yang terbaik dari kedua dunia:
misalnya
Ini sangat kuat untuk fungsi CLR, karena ada biaya administrasi tambahan untuk mengubah / menggunakan itu.
Dan ini adalah cara yang lebih baik daripada menggunakan master (dan menandai sebagai objek sistem, yang tidak dijamin akan portabel maju). Saya ingin tahu bagaimana pengembang Anda mengharapkan untuk membuat fungsinya dalam
sys
skema.Saya mengerti bahwa mempertahankan banyak salinan fungsi dalam 500 basis data tidak lebih sulit daripada mempertahankan satu salinan, tetapi memiliki banyak salinan benar-benar hanya menguntungkan ketika Anda memiliki pengecualian (mis. Klien A ingin fungsi mereka menangani NULL secara berbeda, atau sesuatu). Dalam hal ini saya akan meninggalkan sinonim di semua database lain, dan memperkenalkan versi khusus fungsi hanya dalam database itu.
(Ini mengasumsikan bahwa fungsi tersebut tidak bergantung pada akses data apa pun di dalam basis data klien, tentu saja - yang tentunya dapat memperumit masalah.)
sumber
Saya harus tidak setuju dengan Aaron (dan jawaban yang diterima).
Pendekatan Aaron adalah cara saya suka berurusan dengan "hal-hal DBA" misalnya skrip pemeliharaan. Saya tidak akan pernah mau melakukan ini dengan fungsi perpustakaan yang akan dipanggil oleh basis data pengguna.
Mengapa? Anda akan menuju ke database yang setara dengan DLL Hell .
Instal .net 4.5 di server yang menjalankan aplikasi .net 2.0 dan apa yang terjadi? Tidak ada, aplikasi Anda terus menggunakan kerangka kerja 2.0. Perbarui fungsi LastIndexOf Anda di server yang menampung 3 aplikasi database (sebagai bagian dari peningkatan ke salah satunya) dan apa yang terjadi? Ketiganya kini menggunakan versi terbaru.
Alternatifnya adalah pendekatan yang diadopsi oleh SQL # . Ini diinstal ke skema di setiap basis data pengguna, sehingga Anda dapat dengan aman memutakhirkan basis data untuk Aplikasi-X tanpa risiko stabilitas Aplikasi-Y.
Jika Anda bekerja di lingkungan manajemen perubahan yang dikontrol ketat, Anda tidak punya pilihan, Anda tidak dapat memutakhirkan komponen bersama tanpa menguji semua konsumen komponen. Jika Anda bekerja di tempat yang sedikit lebih "cepat dan longgar", Anda bebas untuk mengambil risiko dengan memecahkan sesuatu tanpa sengaja dengan tambalan / peningkatan.
sumber
LastIndexOf
untuk berubah, apalagi dengan cara yang hanya memecah beberapa aplikasi / database. Saya akan mengatakan itu adalah masalah yang lebih besar untuk CLR atau fungsi yang benar-benar pusat / kompleks yang melayani banyak aplikasi. (3) Preferensi saya yang sebenarnya adalah tidak menggunakan fungsi sama sekali untuk tugas-tugas sederhana.Utility
DB untuk hal-hal yang biasa disebut perpustakaan, tetapi sedikit meningkatkan risiko dan memerlukan pengujian menyeluruh.Jawaban untuk pertanyaan ini tergantung pada apakah kita berbicara tentang objek T-SQL atau objek SQLCLR. Ada beberapa faktor yang berbeda untuk dipertimbangkan ketika berhadapan dengan objek SQLCLR.
Dalam hal objek T-SQL, kedua jawaban di sini memunculkan poin yang valid. Seperti dijelaskan dalam jawaban @ Aaron , DB pusat bisa sangat berguna, dan Sinonim dapat digunakan untuk membuatnya mudah untuk memiliki beberapa titik DB ke sumber daya bersama dan beberapa menggunakan sumber daya lokal. Tetapi poin yang diangkat dalam jawaban Mark tentang peningkatan risiko karena ketergantungan yang lebih kuat tidak dapat diabaikan.
Namun, jika Anda berurusan dengan objek SQLCLR, maka Anda harus terlebih dahulu mempertimbangkan semua poin yang saya kemukakan dalam jawaban berikut:
Bagaimana cara lebih baik menggunakan Fungsi CLR dari sudut pandang kinerja (ulangi di dalam setiap DB atau memiliki fungsi umum)?
sumber