Bir işlevi çağırdığımızda şema öneki (dbo) neden zorunlu?


9

Kullanıcı varsayılan şema (dbo) ile eşlendiğinde ve şemanın önekini eklemeden [dbo] altındaki tüm tabloları seçebiliriz.

Varsayılan şema altındaysa saklı yordamları önek olmadan yürütebiliriz.

Bu göz önüne alındığında, neden bir işlevi şemaya önek olarak eklememiz gerekiyor?

Teşekkürler!

Yanıtlar:


11

Öyleyse neden dbo altında oluşturulan önek (şema) olmadan fonksiyonu çağırabiliriz?

Gönderen UDF en Kitaplar Çevrimiçi Belgesi

Skaler değerli fonksiyonlar skaler ifadelerin kullanıldığı yerlerde çağrılabilir. Bu, hesaplanan sütunları ve CHECK kısıtlama tanımlarını içerir. Skaler değerli fonksiyonlar EXECUTE ifadesi kullanılarak da yürütülebilir. Skaler değerli fonksiyonlar, fonksiyonun en azından iki parçalı adı kullanılarak çağrılmalıdır .

Bu temelde SQL Server geliştirme ekibi tarafından belirlenen bir kısıtlamadır ve oldukça doğru olduğunu düşünüyorum. Bir şekilde izin verilse bile (sadece konuşma uğruna) hala Şema önekini kullanırım.

Eklemeden çalışsa bile şema adının kullanılmasını her zaman destekliyorum. Bu en iyi uygulamadır ve tüm "İyi" geliştiriciler ne kadar gereksiz olursa olsun onu kullanırlar.

Gördüğüm diğer neden, Veritabanı motoru gibi sistem işlevi getdate ()ve kullanıcı tanımlı işlevler arasında ayrım yapmak için bir şey gerekiyor . Şema adı olmadan işlev çağırma izniniz varsa, veritabanı altyapısı Getdate adlı kullanıcı tarafından oluşturulan işlev veya sistem GETDATE () işlevi arasında nasıl farklılık gösterir.


Öyleyse neden SP'lerle farklı. Söylediğiniz gibi, çarpışmaları adlandırmaktan kaçınmak olabilir. Ben sadece kullanıcı veritabanımda bir SP "oluşturma prosedürü sp_help select getdate ()" oluşturdum ve şema (dbo) ile veya olmadan yürüttüğümde, SQL Server sistem SP ifade eder. Oluşturduğum SP'mi neden yürütmüyor?
Rajesh Ranjan

1
@rajeshRajan sp_procname (yordamınızı SP ile ön eklediğiniz) olduğundan, SQL Server'ı derlenen plan için önce ana veritabanına bakmaya zorlar ve bu proc ana veritabanında bulunduğundan proc'u bulamazsanız, usta sonra o zaman senin idam olurdu. Performans sorunları olduğundan hiçbir zaman sp_ önekiyle proc oluşturmamalısınız.
Shanky

Sanırım Shanky, "neden" sorusunu doğrudan SQL Server geliştirme ekibi tarafından belirlendiğini söylediğinde yanıtladı. Neden böyle yaptığını ve fonksiyonların davranışının prosedürlerle neden tutarsız olduğunu sorabilirsiniz, ancak cevap muhtemelen çok fazla önemli değildir.
Michael J Swart

1
BTW, "sp_" ile başlayan işlemlerin performans etkisi ölçülemez. Yıllardır sorun olmuyor. Sp öneki hala iyi bir fikir olmayabilir, ancak performans nedeni değildir.
Michael J Swart

10

Diğer cevap, bunun bir kısıtlama olduğunu ancak bunun nedeni olmadığını açıklıyor.

Gereksinim her zaman doğru değildir. Skaler UDF'ler düzeltilebilir EXECve yine de örtük çözünürlük kullanılabilir ( örnek )

Bunun çarpışmaları isimlendirmekten kaçınmak olduğunu düşünüyorum.

İşlevlere şema olmadan başvurulmasına izin verilirse crypt_gen_random, 2000 veya 2005'te çağrılmış olan kendi işlevlerini yaratan biri, 2008'de yerleşik bir işlevin adı haline geldiği için daha sonraki bir sürüme yükseltme sorunlarıyla karşılaşır.

Yerleşik execişlevler bu şekilde çağrılamadığından kullanımda herhangi bir belirsizlik yoktur .


Öyleyse neden SP'lerle farklı. Söylediğiniz gibi, çarpışmaları adlandırmaktan kaçınmak olabilir. Ben sadece kullanıcı veritabanımda bir SP "oluşturma prosedürü sp_help select getdate ()" oluşturdum ve şema (dbo) ile veya olmadan yürüttüğümde, SQL Server sistem SP ifade eder. Oluşturduğum SP'mi neden yürütmüyor?
Rajesh Ranjan

3
@Rajesh. Sp_ ile başlayan nesneler her zaman ana / kaynak veritabanına bakmak için özel olarak kaplanmıştır. Ve bu önekten kaçınılması gerektiği belgelenmiştir. Yerleşik işlevler için böyle bir kural yoktur.
Martin Smith
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.