ทำไมคุณต้องการหลีกเลี่ยง Dynamic SQL ในขั้นตอนการจัดเก็บ?


13

ฉันเคยได้ยินคนหนึ่งบอกว่าคุณไม่ต้องการใช้ Dynamic SQL คุณสามารถยกตัวอย่างที่เป็นรูปธรรมหรือตัวอย่างในชีวิตจริงได้ไหม ส่วนตัวฉันรหัสมันสองสามครั้งในฐานข้อมูลของฉัน ฉันคิดว่ามันใช้ได้เพราะความยืดหยุ่น ฉันเดาว่าเกี่ยวกับ SQL Injection หรือ Performance มีอะไรอีกไหม

คำตอบ:


7

ไม่มีอะไรผิดปกติกับการใช้ SQL แบบไดนามิกถ้าคุณต้อง ในความเป็นจริงในบางสถานการณ์มันเป็นตัวเลือกเดียวที่คุณมี มันเป็นคำแนะนำมากกว่าที่จะไม่ใช้มันเพราะใช่มันสามารถนำไปสู่การฉีด SQL ถ้าอินพุตของคุณไม่ถูกสุขลักษณะและใช่โดยใช้ไดนามิก SQL ในโมดูลที่ถูกเรียกมักจะเป็นอันตรายต่อประสิทธิภาพการทำงานของมัน

ฉันไม่คิดว่าจะมีตัวอย่างที่เป็นรูปธรรม แต่ฉันจะพูดแบบนี้: พยายามบรรลุสิ่งที่คุณเป็นหลังจากใช้คำสั่งและข้อความปกติเป็นครั้งแรก - จากนั้นเมื่อคุณหมดช่องทางอื่น ๆ ทั้งหมดแบบไดนามิกแล้ว เพียงจำไว้ว่าการเรียกใช้งานสตริง SQL แบบไดนามิกนั้นเสร็จสิ้นในเซสชันผู้ใช้ที่แยกต่างหากไปยังโมดูลที่กำลังเรียกใช้ดังนั้นคุณอาจพบปัญหาการอนุญาตที่คุณไม่ต้องการ

หากคุณกังวลเกี่ยวกับประสิทธิภาพ ทดสอบมัน หากคุณกังวลเรื่องความปลอดภัย ตรวจสอบข้อมูลที่คุณป้อน ไม่มีถูกหรือผิด - เฉพาะคุณเท่านั้นที่ใช้วิจารณญาณที่ดีที่สุดของคุณตามข้อมูลและเครื่องมือที่คุณมีอยู่ในขณะนั้น


5

Dynamic SQL เป็นเครื่องมือ และในฐานะที่เป็นเครื่องมือมันมีแอพพลิเคชั่นบางอย่าง - สำหรับงานบริหารมันเป็นพระพรตัวอย่างเช่น

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

ฉันจะไม่ป้อนรายละเอียดที่นี่ดังนั้นฉันจะแนะนำบทความที่ยอดเยี่ยมเกี่ยวกับปัญหา Dynamic SQL: The Curse and Blessings ของ Dynamic SQLโดย MVP Erland Sommarskog


1
ฉันจะแชร์ลิงก์นั้นด้วยจะต้องอ่านให้ทุกคนพิจารณาใช้ SQL แบบไดนามิก
HLGEM

1

มันเหมือนกับคุณสมบัติ dbms ส่วนใหญ่หากคุณใช้ในสถานการณ์ที่ถูกต้องมันทำงานได้ดีสถานการณ์ที่ผิดจะแย่ลง

ข้อดี: บางสิ่งไม่สามารถทำได้หากไม่มีมัน โดยทั่วไปแล้วฉันพบสิ่งนี้เพื่อการบริหารเท่านั้นไม่ใช่รหัสแอปพลิเคชัน คำสั่งระบบบางคำสั่งไม่อนุญาตให้ใช้พารามิเตอร์เป็นอินพุต ตัวอย่างเช่นถ้าฉันต้องการเรียกใช้บางสิ่งบางอย่างผ่าน sproc กับทุกฐานข้อมูลในหลาย ๆ กรณีที่มีฐานข้อมูลที่ไม่รู้จักและคำสั่งไม่ยอมรับพารามิเตอร์ฉันมักจะแก้ปัญหานี้ผ่านไดนามิก SQL นี่เป็นสิ่งที่มากกว่าใน Sybase ASE มากกว่า MSSQL

จุดด้อย: ฉันจะไม่เข้าไปมากเพราะฉันคิดว่าเราทุกคนรู้แล้ว แต่อาจมีความเสี่ยงต่อการฉีด SQL ถ้าใช้ไม่ถูกต้อง สิ่งที่ใหญ่กว่าสำหรับฉันก็คือว่าแบบสอบถามจะได้รับการปฏิบัติเช่นเดียวกับที่เป็นอยู่แบบสอบถามที่ไม่ซ้ำกันและไม่ได้เป็นส่วนหนึ่งของแผนแบบสอบถามที่รวบรวมไว้ สำหรับสิ่งที่ทำงานเป็นครั้งคราวไม่มีเรื่องใหญ่ สำหรับสิ่งที่ถูกดำเนินการหลายร้อยครั้งต่อนาทีและที่จะมี sql ที่ไม่ซ้ำกันจำนวนมากมันจะสร้างใหม่จำนวนมากที่อาจไม่จำเป็นแบบสอบถามแบบสอบถามแผนกินรอบและลดเวลาที่ถูกต้องของแคชแผน


การใช้งานแอปพลิเคชั่นที่ยอดเยี่ยมใน Sybase ASE คือการหมุนโดยไม่ทราบค่าที่จะหมุน สิ่งนี้สามารถทำได้โดยใช้ dynamic SQL ใน proc ที่เก็บไว้ แต่เท่าที่ฉันรู้ Sybase ASE ไม่สนับสนุนไวยากรณ์ในการทำสิ่งนี้โดยตรงเป็นแบบสอบถาม เมื่อมีการทราบค่าจะสามารถเขียนแบบสอบถามเพื่อหมุนข้อมูลได้
richardcrossley

-7

ห้ามใช้ Dynamic SQL

99% ของเวลาที่ใช้ Dynamic SQL เนื่องจากขาดความรู้เกี่ยวกับวิธีการใช้พารามิเตอร์ทางเลือกในขั้นตอนการจัดเก็บส่วนที่เหลือ 1% ของเวลาที่ใช้ในการสร้างแบบสอบถามที่ซับซ้อนมากสำหรับรายงานที่ลูกค้าไม่เข้าใจ แม้ Curse and Blessings ของ Dynamic SQLไม่ได้แสดงตัวอย่างว่าทำไมจึงเป็นความคิดที่ดีที่จะใช้มันแทนที่จะแนะนำว่ามันเป็นปัญหาเพราะมันเพิ่มความซับซ้อนในการดีบักบำรุงรักษาและไม่พูดถึงความเสี่ยงด้านความปลอดภัยของ SQL การฉีดประสิทธิภาพไม่ดีไม่ใช่เพราะแคช แต่การปฏิบัติที่ไม่ดีที่มาพร้อมกับการใช้ตารางและเคอร์เซอร์ชั่วคราวซึ่งแน่นอนว่าขี้เกียจและไร้เดียงสาโปรแกรมเมอร์จะใช้ในทางที่ผิด ไม่มีสิ่งเช่นความยืดหยุ่นในการเขียนแบบสอบถามด้วยวิธีนั้น SQL เป็นภาษาที่ประกาศและควรได้รับการจัดการเช่นนี้

ความเกียจคร้านเป็นรากฐานของความชั่วร้ายทั้งหมด

ขัดคำตอบนี้จะไปจัดอันดับในคน downvoted มากที่สุด


บทความนี้มีตัวอย่างอย่างน้อยหนึ่งตัวอย่างของกรณีการใช้งานที่สมบูรณ์แบบสำหรับ SQL แบบไดนามิกและ "ไม่มีสิ่งเช่นความยืดหยุ่นในการเขียนคำสั่งด้วยวิธีนี้ ... " ไม่เป็นความจริง - Dynamic SQL เป็นสิ่งที่ช่วยให้สิ่งนี้ มีความยืดหยุ่น
LowlyDBA

พารามิเตอร์ตัวเลือก? คุณหมายถึงantipattern หรือไม่
Forrest

@ LowlyDBA บทความนำเสนอตัวอย่างอย่างน้อยหนึ่งอย่าง: SELECT ที่ง่ายที่สุดเท่าที่เคยเห็นมาการแก้ไขปัญหาที่ซับซ้อนคืออะไร? และเพื่อความยืดหยุ่นใช่สำหรับโปรแกรมเมอร์ที่ไร้เดียงสา
Ivanzinho

@Forrest ทำไมถึงเรียกว่า "antipattern" เนื่องจากลิงก์ที่คุณระบุไม่เคยบอกว่าและยังไม่เคยแสดงว่ามีการปรับปรุงมากเพียงใดหลังจากการเขียนตรรกะไปยัง Dynamic SQL (ซึ่งในกรณีนี้จะไม่มีนัยสำคัญเมื่อเทียบกับสโนว์บอลในการรักษาแบบสอบถามนั้นในที่สุด)
Ivanzinho

นี่คือคำตอบที่อิงตามความคิดเห็น (แย่) IMHO คุณยังไม่ได้ให้ตัวอย่างที่เป็นรูปธรรมเกี่ยวกับปัญหาที่คุณอธิบายและไม่ได้กำหนดโปรไว้ในการใช้ SQL แบบไดนามิก
George.Palacios
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.