Buat fungsi dalam database pusat atau ulangi di setiap database?

8

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?

David George
sumber
1
Saya pikir ide di baliknya bisa seperti 'Apa yang akan Anda lakukan dalam kasus perbaikan bug hipotetis? Buka setiap basis data tunggal dan perbaiki setiap salinan secara terpisah? '
dezso
1
Overhead Administrasi tidak relevan di sini karena saya dapat memperbarui semua database semudah satu basis data
David George
Dan apakah pengembang Anda tahu tentang itu? :) Dan mungkin dia merasa itu mengimplementasikan fungsionalitas dasar sehingga harus di intinya.
dezso
Iya. Itulah pertanyaan saya, haruskah sesuatu yang dapat dianggap inti menjadi bagian dari basis data pengguna atau dibagi di antara semua basis data dari satu basis data tunggal?
David George
Ya, saya mencoba menyajikan dua argumen yang kurang lebih valid yang mendukung sentralisasi. Saya pikir itu bisa menjadi masalah kebijakan atau selera pribadi Anda - jelas dari kata-kata yang Anda tidak suka ide.
dezso

Jawaban:

12

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:

  1. hanya ada satu salinan objek untuk dipelihara
  2. pengembang tidak harus memberikan nama tiga atau empat bagian

misalnya

USE UtilityDB;
GO
CREATE FUNCTION dbo.LastIndexOf(...) ...
GO
USE otherDB;
GO
CREATE SYNONYM dbo.LastIndexOf FOR UtilityDB.dbo.LastIndexOf;
GO

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 sysskema.

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.)

Aaron Bertrand
sumber
5

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 .

Versi yang tidak kompatibel

... Sebelum Windows 2000, Windows rentan terhadap ini karena tabel kelas COM dibagikan di semua pengguna dan proses. Hanya satu objek COM, dalam satu DLL / EXE dapat dinyatakan memiliki ID Kelas COM global tertentu pada suatu sistem. Jika ada program yang diperlukan untuk membuat turunan dari kelas itu, ia mendapatkan apa pun yang merupakan implementasi terdaftar terpusat saat ini. Akibatnya, penginstalan program yang menginstal versi baru dari objek umum dapat secara tidak sengaja merusak program lain yang sebelumnya diinstal.

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.

Mark Storey-Smith
sumber
Biarkan saya memberikan bantahan, karena Anda sepertinya menginginkannya dan sekarang saya punya waktu luang yang tidak saya miliki sebelumnya. :-) (1) Saya berasumsi bahwa kumpulan database yang dimaksud semuanya terkait, dan bukan bagian dari aplikasi yang sama sekali berbeda. (2) Dalam hal ini saya tidak curiga ada banyak bahaya untuk fungsi yang dipanggil LastIndexOfuntuk 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.
Aaron Bertrand
1
Selalu menyambut pikiran Anda tentu saja :)
Mark Storey-Smith
Hai yang disana. Sebagai pencipta SQL # Saya sangat menghargai penyebutan positif :-). Namun, saya harus mengklarifikasi bahwa titik keputusan utama untuk menggunakan Skema terpisah untuk semua objek SQL # adalah membuat ruang nama sehingga tidak akan ada konflik penamaan di mana pun SQL # diinstal. Namun, Anda memunculkan poin yang perlu dipertimbangkan tentang versi, tergantung pada bagaimana aplikasi disusun. Secara pribadi, saya suka memiliki UtilityDB untuk hal-hal yang biasa disebut perpustakaan, tetapi sedikit meningkatkan risiko dan memerlukan pengujian menyeluruh.
Solomon Rutzky
0

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)?

Solomon Rutzky
sumber