Mengapa awalan skema (dbo) wajib ketika kita memanggil suatu fungsi?

9

Ketika pengguna dipetakan dengan skema default (dbo) dan kami dapat memilih semua tabel di bawah [dbo] tanpa mengawali skema.

Kami dapat menjalankan prosedur tersimpan tanpa awalan jika itu di bawah skema default.

Mengingat itu, mengapa kita perlu awalan fungsi dengan skema?

Terima kasih!

Rajesh Ranjan
sumber

Jawaban:

11

Lalu mengapa kita bisa memanggil fungsi tanpa awalan (skema), dibuat di bawah dbo?

Dari Buku Dokumen Online pada UDF

Fungsi bernilai skalar dapat dipanggil di mana ekspresi skalar digunakan. Ini termasuk kolom yang dihitung dan PERIKSA definisi kendala. Fungsi yang dihargai skalar juga dapat dijalankan dengan menggunakan pernyataan EXECUTE. Fungsi yang dihargai skalar harus dipanggil dengan menggunakan setidaknya nama dua bagian dari fungsi .

Jadi ini pada dasarnya adalah batasan yang ditetapkan oleh tim pengembangan SQL Server dan saya menganggapnya cukup benar. Bahkan jika itu entah bagaimana diperbolehkan (hanya demi percakapan) saya masih akan menggunakan awalan Skema.

Saya selalu mendukung menggunakan nama skema bahkan jika itu akan berhasil tanpa menambahkannya. Ini adalah praktik terbaik dan semua pengembang "Bagus" menggunakannya tidak peduli seberapa banyak itu berlebihan.

Alasan lain yang saya lihat adalah, mesin Database membutuhkan sesuatu untuk membedakan antara fungsi sistem seperti getdate ()dan fungsi yang ditentukan pengguna. Jika Anda diizinkan untuk memanggil fungsi tanpa nama skema, bagaimana mesin basis data akan membedakan antara fungsi yang dibuat pengguna bernama Getdate atau fungsi sistem GETDATE ().

Shanky
sumber
Lalu mengapa berbeda dengan SP. Seperti yang Anda katakan mungkin untuk menghindari penamaan tabrakan. Saya baru saja membuat SP "buat prosedur sp_help sebagai pilih getdate ()" di basis data pengguna saya dan ketika saya jalankan dengan atau tanpa skema (dbo), SQL Server mengacu pada sistem SP. Mengapa tidak menjalankan SP saya yang telah saya buat.
Rajesh Ranjan
1
@rajeshRajan Karena Anda memiliki sp_procname (Anda mengawali prosedur Anda dengan SP) ini memaksa SQL Server untuk melihat pertama ke dalam database master untuk paket yang dikompilasi dan karena proc ini ada dalam database master akan dieksekusi bukan milik Anda, jika bukan untuk menemukan proc di master maka itu akan dieksekusi milikmu. Anda tidak boleh membuat proc dengan awalan sp_ karena memiliki masalah kinerja.
Shanky
Saya pikir Shanky menjawab pertanyaan "mengapa" secara langsung ketika ia menyebutkan itu ditetapkan oleh tim pengembangan SQL Server. Anda bisa bertanya mengapa mereka melakukannya dan mengapa perilaku fungsi tidak konsisten dengan prosedur, tetapi jawabannya mungkin tidak terlalu penting.
Michael J Swart
1
BTW, dampak kinerja dari prosedur yang dimulai dengan "sp_" tidak dapat diukur. Sudah bertahun-tahun tidak menjadi masalah. Awalan sp mungkin masih bukan ide yang baik, tetapi kinerja bukan alasannya.
Michael J Swart
10

Jawaban lain menjelaskan bahwa ini adalah batasan tetapi bukan alasan mengapa.

Persyaratannya tidak selalu benar. Skalar UDF dapat dilakukan EXECdan masih menggunakan resolusi implisit ( contoh )

Saya membayangkan ini untuk menghindari penamaan tabrakan.

Jika fungsi diizinkan untuk direferensikan tanpa skema maka seseorang yang membuat fungsi mereka sendiri yang kebetulan dipanggil crypt_gen_randompada tahun 2000 atau 2005 akan mengalami masalah pemutakhiran ke versi yang lebih baru karena ini menjadi nama fungsi yang dibangun pada tahun 2008.

Tidak ada ambiguitas dengan execpenggunaan karena fungsi bawaan tidak bisa disebut seperti itu.

Martin Smith
sumber
Lalu mengapa berbeda dengan SP. Seperti yang Anda katakan mungkin untuk menghindari penamaan tabrakan. Saya baru saja membuat SP "buat prosedur sp_help sebagai pilih getdate ()" di basis data pengguna saya dan ketika saya jalankan dengan atau tanpa skema (dbo), SQL Server mengacu pada sistem SP. Mengapa tidak menjalankan SP saya yang telah saya buat.
Rajesh Ranjan
3
@Rajesh. Objek awal sp_ adalah cased khusus untuk selalu melihat dalam database master / sumber daya. Dan didokumentasikan bahwa awalan ini harus dihindari. Tidak ada konvensi untuk fungsi bawaan.
Martin Smith