ข้อสังเกตบางอย่าง
ขั้นตอนการจัดเก็บให้คุณนำรหัสมาใช้ใหม่และการห่อหุ้ม (สองเสาหลักของการพัฒนาซอฟต์แวร์)
เฉพาะในกรณีที่คุณใช้อย่างถูกต้องในบริบทที่ควรใช้งาน การอ้างสิทธิ์เดียวกันสามารถพูดได้เกี่ยวกับฟังก์ชั่น (ในการเขียนโปรแกรมเชิงโครงสร้าง) หรือวิธีการ (ในการเขียนโปรแกรมเชิงวัตถุ) และยังเราเห็นฟังก์ชั่น 1K และวัตถุ mega-ass
สิ่งประดิษฐ์ไม่ได้ให้ประโยชน์กับคุณ การใช้สิ่งประดิษฐ์เหล่านั้นอย่างเหมาะสมคือสิ่งที่ให้ประโยชน์เหล่านั้น
การรักษาความปลอดภัย (คุณสามารถให้ / เพิกถอนการอนุญาตในแต่ละ proc ที่เก็บไว้)
ใช่. นี่เป็นจุดที่ดีและหนึ่งในเหตุผลหลักที่ฉันชอบขั้นตอนการจัดเก็บ มีการควบคุมการเข้าถึงที่ละเอียดยิ่งกว่าสิ่งที่สามารถทำได้โดยทั่วไปด้วยมุมมองและบัญชีผู้ใช้
ปกป้องคุณจากการโจมตีของการฉีด SQL
ไม่เฉพาะ SPs เนื่องจากคุณสามารถป้องกันระดับเดียวกันได้ด้วยคำสั่ง SQL ที่กำหนดพารามิเตอร์และการขัดจังหวะอินพุต ผมจะใช้สำนักนอกเหนือไปจากที่ แต่เป็นเรื่องของ"การรักษาความปลอดภัยในเชิงลึก"
และยังช่วยในเรื่องความเร็วด้วย (แม้ว่า DBA นั้นจะกล่าวว่าเริ่มต้นด้วย SQL Server 2008 แม้กระทั่งคำสั่ง SQL ทั่วไปก็จะถูกคอมไพล์ถ้ามันใช้เวลามากพอ)
นี่คือผู้จำหน่ายฐานข้อมูลที่เฉพาะเจาะจง แต่โดยทั่วไป DBA ของคุณถูกต้อง คำสั่ง SQL (คงที่หรือ parametrized) จะได้รับการรวบรวม SP ช่วยถ้าคุณต้องการ / จำเป็นต้องรวบรวมและคำนวณข้อมูลที่คุณไม่สามารถทำได้ด้วยคำสั่ง SQL แบบง่าย ๆ แต่ถูกผนวกเข้ากับ SQL อย่างแน่นหนาและไม่รับประกันการไปกลับไปยังเซิร์ฟเวอร์แอป
ตัวอย่างที่ดีคือการสอบถามข้อมูลลงในเคอร์เซอร์ชั่วคราว (หรือเคอร์เซอร์) ที่จะเรียกใช้ SQL ตัวอื่น คุณสามารถทำได้โดยทางโปรแกรมในเซิร์ฟเวอร์แอพหรือคุณสามารถบันทึกการเดินทางไปกลับหลาย ๆ ครั้งโดยทำใน db
อย่างไรก็ตามสิ่งนี้ไม่ควรเป็นบรรทัดฐาน หากคุณมีหลายกรณีนั่นแสดงว่าเป็นสัญญาณของการออกแบบฐานข้อมูลที่ไม่ดี (หรือคุณดึงข้อมูลจากสกีมาฐานข้อมูลที่เข้ากันไม่ได้ข้ามแผนก)
เรากำลังพัฒนาแอพที่ซับซ้อนโดยใช้วิธีการพัฒนาซอฟต์แวร์ Agile
ความว่องไวเกี่ยวข้องกับกระบวนการวิศวกรรมซอฟต์แวร์และการจัดการความต้องการไม่ใช่เทคโนโลยี
ทุกคนคิดเหตุผลที่ดีว่าทำไมพวกเขาไม่ต้องการใช้ procs ที่เก็บไว้?
คำถามผิด
คำถามนี้ผิดและเทียบเท่ากับการถามว่า "มีเหตุผลอะไรบ้างที่จะไม่ใช้ GOTO" ฉันเข้าข้าง Niklaus Wirth มากกว่า Dijkstra ในเรื่องนี้ ฉันเข้าใจได้ว่าความเชื่อมั่นของ Dijkstra มาจากไหน แต่ฉันไม่เชื่อว่ามันใช้ได้ 100% ในทุกกรณี เหมือนกับ procs ของร้านค้าและเทคโนโลยีใด ๆ
เครื่องมือดีเมื่อใช้อย่างถูกต้องตามวัตถุประสงค์และเมื่อเป็นเครื่องมือที่ดีที่สุดสำหรับงานเฉพาะ การใช้มันเป็นอย่างอื่นไม่ใช่ข้อบ่งชี้ว่าเครื่องมือนั้นผิด แต่ผู้ใช้ไม่ทราบว่าเขา / เธอกำลังทำอะไรอยู่
คำถามที่เหมาะสมคือ"ควรหลีกเลี่ยงรูปแบบการใช้กระบวนงานที่เก็บไว้ประเภทใด" หรือ"ภายใต้เงื่อนไขว่าฉันควร (หรือไม่) ควรใช้วิธีการจัดเก็บ" การหาเหตุผลที่จะไม่ใช้เทคโนโลยีเป็นเพียงการกล่าวโทษความผิดของเครื่องมือซึ่งตรงข้ามกับการวางความรับผิดชอบด้านวิศวกรรมอย่างตรงจุดที่มันเป็นเจ้าของ - ในวิศวกร
กล่าวอีกนัยหนึ่งก็คือการคัดออกหรือคำสั่งของความไม่รู้
ฉันเดาว่า DBAs ไม่ต้องการรักษา procs ที่เก็บไว้ แต่ดูเหมือนว่าจะมีวิธีเชิงลบมากเกินไปที่จะพิสูจน์การตัดสินใจในการออกแบบ
สิ่งที่พวกเขากำลังทำคือการฉายผลลัพธ์ของการตัดสินใจทางวิศวกรรมที่ไม่ดีของพวกเขาในเครื่องมือที่พวกเขาใช้ไม่ดี
จะทำอย่างไรในกรณีของคุณ?
ประสบการณ์ของผมคือเมื่ออยู่ในกรุงโรมทำตามที่ชาวโรมันทำ
อย่าสู้กับมัน หากคนใน บริษัท ของคุณต้องการติดป้ายชื่อร้านค้าไว้เป็นแนวทางปฏิบัติที่ไม่ดีให้พวกเขา อย่างไรก็ตามโปรดทราบว่านี่อาจเป็นธงสีแดงในการปฏิบัติด้านวิศวกรรมของพวกเขา
การติดฉลากแบบทั่วไปของสิ่งต่าง ๆ เช่นการปฏิบัติที่ไม่ดีมักจะทำในองค์กรที่มีโปรแกรมเมอร์ไร้ความสามารถมากมาย โดยการทำบัญชีดำบางสิ่งองค์กรพยายามจำกัดความเสียหายที่เกิดจากภายในด้วยการไร้ความสามารถของตัวเอง ฉันไม่ชอบคุณ
การวางตัวทั่วไปเป็นแม่ของสกรูทุกตัว การกล่าวว่า procs ที่เก็บไว้ (หรือเทคโนโลยีประเภทใด ๆ ) เป็นแนวปฏิบัติที่ไม่ดีนั่นเป็นลักษณะทั่วไป การวางนัยทั่วไปเป็นความลับสำหรับคนไร้ความสามารถ วิศวกรไม่ทำงานกับการสรุปทั่วไปที่เห็นได้ชัด พวกเขาทำการวิเคราะห์เป็นราย ๆ ไปทำการวิเคราะห์การแลกเปลี่ยนและดำเนินการตัดสินใจทางวิศวกรรมและการแก้ปัญหาตามข้อเท็จจริงที่มีอยู่ในบริบทที่พวกเขาควรจะแก้ปัญหา
วิศวกรที่ดีไม่ติดป้ายกำกับว่าเป็นการฝึกฝนที่ไม่ดีในลักษณะทั่วไป พวกเขาดูที่ปัญหาเลือกเครื่องมือที่เหมาะสมทำการแลกเปลี่ยน กล่าวอีกนัยหนึ่งพวกเขาทำวิศวกรรม
ความคิดเห็นของฉันเกี่ยวกับวิธีที่จะไม่ใช้พวกเขา
อย่าวางตรรกะที่ซับซ้อนเกินกว่าการรวบรวมข้อมูล (และอาจมีการแปลง) มันเป็นการดีที่จะวางตรรกะการนวดข้อมูลไว้ในนั้นหรือเพื่อรวมผลลัพธ์ของแบบสอบถามหลายรายการกับพวกเขา แต่นั่นเป็นเรื่องของมัน สิ่งใดที่เกินกว่าจะถือว่าเป็นตรรกะทางธุรกิจซึ่งควรจะอยู่ที่อื่น
อย่าใช้มันเป็นเพียงกลไกการป้องกันการฉีด SQL เท่านั้น คุณควรทิ้งไว้ในกรณีที่มีสิ่งที่ไม่ดีเกิดขึ้นกับพวกเขาแต่ควรมีเหตุผลด้านการป้องกันอยู่ข้างหน้า - การตรวจสอบ / ขัดลูกค้าการตรวจสอบ / ขัดถูฝั่งเซิร์ฟเวอร์ตรวจสอบ / ขัดถู แบบจำลองโดเมนและในที่สุดก็ถูกส่งผ่านไปยังคำสั่ง parametrized (ซึ่งอาจเป็นคำสั่ง parametrized SQL หรือ parametrized procs ที่เก็บไว้)
อย่าทำให้ฐานข้อมูลเป็นที่เดียวที่มีโปรแกรมจัดเก็บของคุณ procs ร้านค้าของคุณควรได้รับการปฏิบัติเช่นเดียวกับที่คุณปฏิบัติกับซอร์สโค้ด C # หรือ Java ของคุณ นั่นคือแหล่งที่มาควบคุมคำนิยามข้อความของ procs ร้านค้าของคุณ ผู้คนพูดจาโผงผางที่ร้านค้าไม่สามารถควบคุมแหล่งที่มาได้ - bullcrap พวกเขาแค่ไม่รู้ว่านรกเลือดพวกเขากำลังพูดถึงอะไร
ความคิดเห็นของฉันในการใช้งานอย่างไร / ที่ไหน
แอปพลิเคชันของคุณต้องการข้อมูลที่จำเป็นต้องมีการถ่ายโอนหรือรวบรวมจากแบบสอบถามหรือมุมมองหลายรายการ คุณสามารถถ่ายข้อมูลนั้นออกจากแอปพลิเคชันไปยัง db ที่นี่คุณต้องทำการวิเคราะห์ประสิทธิภาพเนื่องจากก) เอ็นจิ้นฐานข้อมูลมีประสิทธิภาพมากกว่าที่เซิร์ฟเวอร์แอปในการทำสิ่งเหล่านี้แต่ b) เซิร์ฟเวอร์แอปจะปรับขนาดในแนวนอนได้ง่ายขึ้น
การควบคุมการเข้าถึงเมล็ดละเอียด คุณไม่ต้องการให้คนโง่ที่เข้าร่วม cartesian ที่ทำงานอยู่ในฐานข้อมูลของคุณ แต่คุณไม่สามารถห้ามคนอื่น ๆ ในการรันคำสั่ง SQL โดยพลการเช่นนั้น วิธีการแก้ปัญหาทั่วไปคือการอนุญาตให้ใช้คำสั่ง SQL โดยพลการในการพัฒนาและสภาพแวดล้อม UAT ในขณะที่ห้ามใช้ในระบบ systest และสภาพแวดล้อมการผลิต คำสั่งใด ๆ ที่จะต้องทำให้มันเป็น systest หรือการผลิตจะเข้าสู่ขั้นตอนการจัดเก็บรหัสตรวจสอบโดยทั้งนักพัฒนาและ dbas
ความต้องการใด ๆ ที่ถูกต้องในการเรียกใช้คำสั่ง SQL ที่ไม่ได้อยู่ใน store proc จะต้องผ่านชื่อผู้ใช้ / บัญชีและกลุ่มการเชื่อมต่ออื่น (ด้วยการใช้งานที่ได้รับการตรวจสอบอย่างเข้มงวดและหมดกำลังใจ)
- ในระบบเช่น Oracle คุณสามารถเข้าถึง LDAP หรือสร้าง symlink ไปยังฐานข้อมูลภายนอก (เช่นการเรียกร้านค้า proc บนฐานข้อมูลพันธมิตรทางธุรกิจผ่าน vpn)วิธีที่ง่ายในการทำรหัสสปาเก็ตตี้ แต่เป็นจริงสำหรับกระบวนทัศน์การเขียนโปรแกรมทั้งหมดและบางครั้ง คุณมีข้อกำหนดทางธุรกิจ / สภาพแวดล้อมเฉพาะซึ่งนี่เป็นทางออกเดียว Procs ของร้านค้าช่วยห่อหุ้มความน่ารังเกียจในสถานที่แห่งเดียวอยู่ใกล้กับข้อมูลและไม่ต้องไปที่เซิร์ฟเวอร์แอป
ไม่ว่าคุณจะรันสิ่งนี้บน db เป็น store proc หรือบนเซิร์ฟเวอร์แอปของคุณขึ้นอยู่กับการวิเคราะห์การแลกเปลี่ยนที่คุณต้องทำในฐานะวิศวกร ตัวเลือกทั้งสองจะต้องได้รับการวิเคราะห์และพิสูจน์ด้วยการวิเคราะห์บางประเภท ไม่ทางใดก็ทางหนึ่งโดยกล่าวหาว่าทางเลือกอื่น ๆ ว่า "การปฏิบัติที่ไม่ดี" นั่นเป็นเพียงปัญหาทางวิศวกรรมที่ไม่ดี
- ในสถานการณ์ที่คุณไม่สามารถขยายเซิร์ฟเวอร์แอปของคุณ (.ie. ไม่มีงบประมาณสำหรับฮาร์ดแวร์ใหม่หรืออินสแตนซ์ของระบบคลาวด์) แต่ด้วยความจุมากมายบนฐานข้อมูลแบ็คเอนด์ (ซึ่งเป็นเรื่องปกติที่คนจำนวนมากสนใจยอมรับ) เพื่อย้ายตรรกะทางธุรกิจเพื่อจัดเก็บ procs ไม่สวยและสามารถนำไปสู่โมเดลโดเมนโลหิตจาง ... แต่แล้วอีกครั้ง ... การวิเคราะห์การแลกเปลี่ยนสิ่งที่แฮ็กซอฟต์แวร์ส่วนใหญ่ดูดเอาไว้
ไม่ว่าจะเป็นวิธีการแก้ปัญหาอย่างถาวรหรือไม่นั้นเป็นข้อ จำกัด ที่สังเกตได้ในขณะนั้น
หวังว่ามันจะช่วย