เหตุใดคำนำหน้าสคีมา (dbo) จึงจำเป็นเมื่อเราเรียกใช้ฟังก์ชัน


9

เมื่อผู้ใช้แมปกับสคีมาเริ่มต้น (dbo) และเราสามารถเลือกตารางทั้งหมดภายใต้ [dbo] โดยไม่ต้องนำหน้าสคีมา

เราสามารถดำเนินการขั้นตอนการจัดเก็บโดยไม่มีคำนำหน้าหากอยู่ภายใต้สคีมาเริ่มต้น

ระบุว่าทำไมเราต้องนำหน้าฟังก์ชันด้วยสคีมา

ขอบคุณ!

คำตอบ:


11

แล้วทำไมเราถึงเรียกฟังก์ชั่นโดยไม่มีคำนำหน้า (schema) สร้างขึ้นภายใต้ dbo?

จากBooks Online Document เกี่ยวกับ UDF

ฟังก์ชั่นที่มีมูลค่าสเกลาสามารถเรียกใช้โดยใช้นิพจน์สเกลาร์ ซึ่งรวมถึงคอลัมน์ที่คำนวณและคำจำกัดความของ CHECK ฟังก์ชั่นที่มีมูลค่าสเกลาสามารถดำเนินการได้โดยใช้คำสั่ง EXECUTE ฟังก์ชั่นเกลามูลค่าจะต้องถูกเรียกโดยใช้เวลาอย่างน้อยชื่อสองส่วนของฟังก์ชั่น

ดังนั้นนี่เป็นข้อ จำกัด ที่กำหนดโดยทีมพัฒนา SQL Server และฉันคิดว่ามันค่อนข้างถูกต้อง แม้ว่าจะได้รับอนุญาตอย่างใด (เพียงเพื่อการสนทนา) ฉันจะยังคงใช้คำนำหน้า Schema

ฉันสนับสนุนการใช้ชื่อสคีมาเสมอแม้ว่าจะใช้งานได้โดยไม่เพิ่มก็ตาม นี่คือแนวปฏิบัติที่ดีที่สุดและนักพัฒนา "ดี" ทุกคนใช้งานไม่ว่าจะซ้ำซ้อนมากแค่ไหน

เหตุผลอื่นที่ฉันเห็นคือเอ็นจิ้นฐานข้อมูลต้องการบางอย่างเพื่อแยกความแตกต่างระหว่างฟังก์ชั่นของระบบและฟังก์ชั่นที่getdate ()ผู้ใช้กำหนด หากคุณได้รับอนุญาตให้เรียกใช้ฟังก์ชันโดยไม่มีชื่อสกีมาว่ากลไกจัดการฐานข้อมูลจะแยกความแตกต่างระหว่างฟังก์ชันที่ผู้ใช้สร้างขึ้นชื่อ Getdate หรือฟังก์ชัน GETDATE () ของระบบได้อย่างไร


ถ้าอย่างนั้นทำไมมันถึงแตกต่างกับ SP ดังที่คุณกล่าวว่าอาจเป็นการหลีกเลี่ยงการตั้งชื่อการชน ฉันเพิ่งสร้าง SP "สร้างโพรซีเดอร์ sp_help เป็น select getdate ()" ในฐานข้อมูลผู้ใช้ของฉันและเมื่อฉันรันด้วยหรือไม่มี schema (dbo), SQL Server อ้างถึงระบบ SP ทำไมมันไม่รัน SP ที่ฉันสร้างขึ้น
Rajesh Ranjan

1
@rajeshRajan เนื่องจากคุณมี sp_procname (คุณนำหน้าโพรซีเดอร์ของคุณด้วย SP) สิ่งนี้จะบังคับให้เซิร์ฟเวอร์ SQL ตรวจสอบฐานข้อมูลหลักสำหรับแผนเรียบเรียงเป็นอันดับแรกและเนื่องจาก proc นี้มีอยู่ในฐานข้อมูลต้นแบบจะไม่ถูกดำเนินการของคุณหากไม่พบ proc ในระดับปริญญาโทแล้วมันจะได้ดำเนินการของคุณ คุณไม่ควรสร้าง proc ด้วยคำนำหน้า sp_ เพราะมีปัญหาเรื่องประสิทธิภาพ
Shanky

ฉันคิดว่า Shanky ตอบคำถาม "ทำไม" โดยตรงเมื่อเขากล่าวถึงมันถูกตั้งค่าโดยทีมพัฒนา SQL Server คุณสามารถถามว่าทำไมพวกเขาถึงทำเช่นนั้นและทำไมพฤติกรรมของฟังก์ชั่นนั้นไม่สอดคล้องกับขั้นตอนการทำงาน แต่คำตอบอาจไม่สำคัญมากนัก
Michael J Swart

1
BTW ผลกระทบด้านประสิทธิภาพของขั้นตอนที่ขึ้นต้นด้วย "sp_" ไม่สามารถวัดได้ มันไม่ได้เป็นปัญหามานานหลายปี คำนำหน้า sp ยังอาจไม่ใช่แนวคิดที่ดี แต่ประสิทธิภาพไม่ใช่เหตุผล
Michael J Swart

10

คำตอบอื่น ๆ อธิบายว่านี่เป็นข้อ จำกัด แต่ไม่ใช่เหตุผลว่าทำไม

ความต้องการไม่ได้เป็นจริงเสมอไป สเกลาร์ UDF สามารถเป็นได้EXECและยังคงใช้การแก้ปัญหาโดยนัย ( ตัวอย่าง )

ฉันคิดว่านี่คือการหลีกเลี่ยงการตั้งชื่อการชน

หากฟังก์ชั่นได้รับอนุญาตให้อ้างอิงโดยไม่มีสคีมาแล้วคนที่สร้างฟังก์ชั่นของตัวเองที่ถูกเรียกว่าcrypt_gen_randomในปี 2000 หรือ 2005 จะพบปัญหาในการอัพเกรดเป็นเวอร์ชั่นที่ใหม่กว่าเนื่องจากนี่เป็นชื่อของฟังก์ชันภายในในปี 2008

ไม่มีความคลุมเครือในexecการใช้งานเนื่องจากไม่สามารถเรียกใช้ฟังก์ชันที่มีอยู่แล้วภายในได้


ถ้าอย่างนั้นทำไมมันถึงแตกต่างกับ SP ดังที่คุณกล่าวว่าอาจเป็นการหลีกเลี่ยงการตั้งชื่อการชน ฉันเพิ่งสร้าง SP "สร้างโพรซีเดอร์ sp_help เป็น select getdate ()" ในฐานข้อมูลผู้ใช้ของฉันและเมื่อฉันรันด้วยหรือไม่มี schema (dbo), SQL Server อ้างถึงระบบ SP ทำไมมันไม่รัน SP ที่ฉันสร้างขึ้น
Rajesh Ranjan

3
@Rajesh อ็อบเจ็กต์ที่เริ่มต้น sp_ นั้นเป็นเคสพิเศษที่จะค้นหาในฐานข้อมูลหลัก / ทรัพยากรเสมอ และมีการบันทึกไว้ว่าควรหลีกเลี่ยงคำนำหน้านี้ ไม่มีแบบแผนดังกล่าวสำหรับฟังก์ชั่นในตัว
Martin Smith
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.