ฐานข้อมูลก่อให้เกิดความชั่วร้ายหรือไม่? [ปิด]


186

ฐานข้อมูลก่อให้เกิดความคิดที่ไม่ดีหรือไม่?

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

ในทางกลับกันดูเหมือนว่าถ้าคุณมีตรรกะที่ต้องเกิดขึ้นในช่วงเวลาหนึ่งFOOจะถูกสร้างขึ้นใหม่ในฐานข้อมูลแล้วสถานที่ที่เข้าใจผิดได้มากที่สุดที่จะวางมันเป็นทริกเกอร์แทรกในตาราง FOO

ModifiedDateโดยเฉพาะเวลาที่เรากำลังใช้ทริกเกอร์สำหรับสิ่งที่ง่ายจริงๆเช่นการตั้งค่า


31
นี่เป็นคำถามที่ถูกต้องตามกฎหมายทั้งหมด แต่ฉันไม่ชอบชื่อเรื่องอื้อฉาว ฉันคิดว่าบางอย่างเช่น "อะไรคือปัญหาที่สำคัญที่สุดที่ควรพิจารณาเมื่อใช้ทริกเกอร์ฐานข้อมูล" จะดีกว่ามาก
Tamas Czinege

2
คำถามถูกปิดเพื่อเพิ่มคำตอบ แต่โปรดดูเพิ่มเติมทริกเกอร์ฐานข้อมูลปลอดภัยหรือไม่สำหรับข้อ จำกัด ด้านความสมบูรณ์ของตาราง . (สปอยเลอร์: ไม่พวกเขาไม่ใช่)
Mifeet

16
เว็บไซต์นี้ทำให้ฉันโกรธมาก นี่เป็นคำถามที่ยอดเยี่ยมแต่ก็เหมือนกับคำถามอื่น ๆ อีกมากมายเพราะผู้คนไม่มีจินตนาการที่จะยอมรับคำถามที่ไม่เหมาะกับรูปแบบไบนารีดั้งเดิมของคำถามและคำตอบด้วยเหตุผลบางประการที่คนต่างด้าวรู้สึกจำเป็นต้องทำตาม
Quibblesome

1
ตรรกะทางธุรกิจในทริกเกอร์เป็นปัญหา (ชั่วร้ายถ้าคุณจะ) ลอจิกฐานข้อมูลในทริกเกอร์ไม่ใช่ปัญหา (integrity, logging)
Greg Gum

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

คำตอบ:


147

ปัญหาหลักของทริกเกอร์คือ

  • พวกเขาเป็นสากลอย่างสมบูรณ์ - พวกเขาใช้ไม่ว่าบริบทของกิจกรรมตารางจะเป็นอย่างไร
  • พวกเขาหลบ ๆ ซ่อน ๆ มันง่ายที่จะลืมว่าพวกเขาอยู่ที่นั่นจนกว่าพวกเขาจะทำร้ายคุณด้วยผลที่ไม่ตั้งใจ (และลึกลับมาก)

นี่หมายความว่าพวกเขาจำเป็นต้องใช้อย่างระมัดระวังสำหรับสถานการณ์ที่เหมาะสม ซึ่งในประสบการณ์ของฉันถูก จำกัด ให้ปัญหาความสมบูรณ์ของความสัมพันธ์ (บางครั้งมีความละเอียดมากกว่าที่คุณจะได้รับอย่างชัดเจน); และมักจะไม่ใช้เพื่อวัตถุประสงค์ทางธุรกิจหรือการทำธุรกรรม YMMV


20
มีข้อดี 2 ข้อในบางกรณี
Johnno Nolan

18
"Stealthy" เป็นคำที่ดีใช่ - พูดได้ดี นั่นเป็นเหตุผลที่ฉันมักจะอายไปจากพวกเขา: บ่อยครั้งที่พวกเขาลืมหรือเพิกเฉย จากประสบการณ์ส่วนตัวของฉันการกระตุ้นการกลับมาใหม่มักตามมาด้วยการตบที่หน้าผากของฉันเอง
Christian Nunciato

5
ทั่วโลกเป็นสาเหตุที่พวกเขาดีและจำเป็นสำหรับความสมบูรณ์ของข้อมูลและสิ่งต่าง ๆ เช่นการตรวจสอบ มันไม่ใช่ลบมันเป็นบวก
HLGEM

4
ดังนั้น @ RobertŠevčík-Robajz คุณกำลังพูดว่านักพัฒนาซอฟต์แวร์ทั้งหมดที่คุณรู้จักไม่มีความสามารถใช่หรือไม่?
HLGEM

3
@HGLEM เห็นด้วยควรมีผู้เชี่ยวชาญในการเรียกใช้ทริกเกอร์ สถานการณ์ในชีวิตจริง - ไม่มี สถานการณ์ในชีวิตจริง - วันที่ใช้เวลาพยายามระบุข้อผิดพลาดที่เกี่ยวข้องกับทริกเกอร์ที่ถูกลืม สถานการณ์ในชีวิตจริง - ลอจิกทริกเกอร์ถูกส่งออกไปยังตรรกะของแอปพลิเคชันอย่างสมบูรณ์ซึ่งสามารถปรับโครงสร้างและทดสอบหน่วยได้อย่างง่ายดาย มันเป็นชีวิตจริงที่ฉันจัดการกับสิ่งนั้นทำให้ฉันพูดว่า "อยู่ห่างจากตัวกระตุ้น" ... ไม่ใช่ความผิดของตัวเรียกเนื่องจากไม่ใช่ความผิดของก้อนหินที่หน้าต่างแตก
Rbjz

80

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

เราใช้ทริกเกอร์อย่างมากเพราะมันวางกิจกรรมเฉพาะ DBMS ภายใต้การควบคุมของฐานข้อมูลที่เป็นของมัน ผู้ใช้งาน DBMS ไม่ควรกังวลเกี่ยวกับเนื้อหาประเภทนั้น ความถูกต้องของข้อมูลอยู่ที่ฐานข้อมูลไม่ใช่แอปพลิเคชันหรือผู้ใช้ที่ใช้งาน ไม่มีข้อ จำกัด และทริกเกอร์และคุณสมบัติอื่น ๆ ในฐานข้อมูลมันเหลืออยู่ในแอปพลิเคชันเพื่อบังคับใช้กฎและใช้แอปพลิเคชัน / ผู้ใช้บั๊กที่ไม่ถูกต้องในการทำลายข้อมูล

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

นอกจากนี้การขาดทริกเกอร์จะป้องกันไม่ให้มีการบังคับใช้กฎของข้อมูลใน DBMS เช่นทริกเกอร์ล่วงหน้าเพื่อให้แน่ใจว่าคอลัมน์มีรูปแบบเฉพาะ โปรดทราบว่านี่จะแตกต่างจากกฎความสมบูรณ์ของข้อมูลซึ่งโดยทั่วไปแล้วเป็นคีย์การค้นหาจากต่างประเทศ


9
"ประมวลผลฟังก์ชั่นในแต่ละแถวเมื่อเลือก" มันเป็นการดีกว่าที่จะใช้ดัชนีตามฟังก์ชันสำหรับจุดประสงค์นี้มากกว่าทริกเกอร์
tuinstoel

10
ไม่จำเป็นทริกเกอร์อาจทำงานเฉพาะเมื่อแทรกหรืออัปเดตแถวแล้วเท่านั้น ดัชนีที่อิงฟังก์ชั่นจะทำงานทุกการเลือก ขึ้นอยู่กับรูปแบบการใช้งานหนึ่งอาจดีกว่าอีก แต่ก็ไม่ได้ดีไปกว่าสิ่งอื่นเสมอไป
jmucchiello

@tuinstoel: ฉันต้องเห็นด้วยกับคำสั่งของคุณบางครั้ง ตัวอย่างเช่น Oracle จะสร้างดัชนีที่อิงฟังก์ชันเท่านั้นหากสามารถพิสูจน์ได้ว่าฟังก์ชันนั้นถูกกำหนดไว้แล้ว บางครั้งที่ไม่สามารถพิสูจน์ได้ (ตัวอย่างเช่นหากฟังก์ชันเกี่ยวข้องกับการค้นหาจากตารางแม้ว่าคุณจะรู้ว่าข้อมูลของตารางไม่เปลี่ยนแปลง)
Adam Paynter

50

เครื่องมือไม่เคยชั่วร้าย การใช้เครื่องมือเหล่านั้นอาจเป็นสิ่งที่ชั่วร้าย


11
ฉันไม่เคยขัดแย้งกันมากขึ้นหลังจากอ่านความคิดเห็น ในมือข้างหนึ่งฉันเป็นมืออาชีพแก้ไขที่สองและเชื่อว่าปืนไม่ได้ชั่วร้ายโดยธรรมชาติ: มันเป็นคนที่ใช้พวกเขา ในทางกลับกันฉันเชื่อว่าทริกเกอร์เป็นสิ่งที่ชั่วร้าย ... ฉันคิดว่าฉันกำลังล่มสลายอยู่ ...
vbullinger

37
ปืน @vbullinger ไม่ใช่ความชั่วร้าย แต่เป็นต้นเหตุของมัน;)
Darragh Enright

2
: D การทำให้เป็นลักษณะทั่วไปเป็นอันตราย (เรียกซ้ำ) คุณมาโดยการทรมาน 'เครื่องมือ' ที่ผู้ตรวจสอบใช้เพื่อ 'สารภาพ' หรือไม่? +1 สำหรับมุมมองต่อไป
Rbjz

22

ฉันเห็นด้วย. ปัญหาของทริกเกอร์คือคนไม่ใช่ทริกเกอร์ แม้ว่าจะต้องพิจารณาเพิ่มเติมและพิจารณาเพิ่มเติมและเพิ่มความรับผิดชอบในการตรวจสอบสิ่งต่าง ๆ อย่างถูกต้อง แต่เราไม่ทิ้งดัชนีเพื่อให้ชีวิตของเราง่ายขึ้น (ดัชนีที่ไม่ถูกต้องอาจไม่ดีเท่ากับตัวเรียกที่ไม่ดี)

ความสำคัญของทริกเกอร์ (ในใจของฉัน) ก็คือ ...
- ระบบใด ๆ ควรอยู่ในสถานะที่ถูกต้องเสมอ
- รหัสเพื่อบังคับใช้สถานะที่ถูกต้องนี้ควรรวมศูนย์ (ไม่เขียนใน SP ทุกตัว)

จากมุมมองของการบำรุงรักษาทริกเกอร์นั้นมีประโยชน์มากสำหรับนักเขียนโค้ดที่มีความสามารถและปัญหาสำหรับผู้เริ่มต้น / มือสมัครเล่นที่มากขึ้น แต่คนเหล่านี้จำเป็นต้องเรียนรู้และเติบโตอย่างใด

ฉันเดาว่ามันจะขึ้นกับสภาพแวดล้อมการทำงานของคุณ คุณมีคนที่เชื่อถือได้ที่เรียนรู้ได้ดีและสามารถเชื่อถือได้ว่ามีระเบียบหรือไม่? หากไม่ใช่คุณมีสองทางเลือก:
- ยอมรับว่าคุณจะต้องสูญเสียฟังก์ชันการทำงานเพื่อชดเชย
- ยอมรับว่าคุณต้องการคนที่แตกต่างหรือต้องการการฝึกอบรมและการจัดการที่ดีกว่า

พวกเขาฟังดูรุนแรงและฉันคิดว่าพวกเขาเป็น แต่มันเป็นความจริงพื้นฐานในใจของฉัน ...


3
>>> ปัญหาเกี่ยวกับทริกเกอร์คือผู้คน ใช่ถ้ามีเพียงคนที่สามารถเขียนโค้ดในชุดประกอบทำงานกับเส็งเคร็ง GUI เดาได้อย่างถูกต้องว่าจะผลักหรือดึงประตูที่ออกแบบมาไม่ดี ... ผู้คน "คุณลักษณะ" ใด ๆ ที่ผิดซ้ำ ๆ ก็คือ "ปีศาจ"
Fakrudeen

1
@Fakrudeen นักพัฒนาที่ได้รับทริกเกอร์ผิดนั้นไม่สามารถเข้าถึงฐานข้อมูลได้
HLGEM

20

ฉันคิดว่าทริกเกอร์ไม่เพียง แต่ไม่ดีเท่านั้น แต่ยังจำเป็นต่อการออกแบบฐานข้อมูลที่ดีอีกด้วย โปรแกรมเมอร์แอปพลิเคชันคิดว่าฐานข้อมูลได้รับผลกระทบจากแอปพลิเคชัน พวกเขามักจะผิด หากความถูกต้องของข้อมูลนั้นได้รับการดูแลไม่ว่าการเปลี่ยนแปลงของข้อมูลนั้นมาจากอะไรทริกเกอร์นั้นเป็นข้อกำหนดและมันก็เป็นเรื่องโง่ที่จะหลีกเลี่ยงพวกมันเพราะโปรแกรมเมอร์บางคนนั้นมีความเป็นชาติพันธุ์มากเกินไปที่จะพิจารณาว่า ไม่ยากที่จะออกแบบหรือทดสอบหรือแก้ไขปัญหาทริกเกอร์หากคุณเป็นผู้พัฒนาฐานข้อมูลที่มีความสามารถ และมันก็ยากที่จะตัดสินว่าทริกเกอร์ทำให้เกิดผลลัพธ์ที่ไม่คาดคิดหากมันเกิดขึ้นกับคุณ หากฉันได้รับข้อผิดพลาดที่บอกว่าตารางที่ฉันไม่ได้อ้างอิงใน sp ของฉันมีข้อผิดพลาด FK ฉันรู้โดยไม่ต้องคิดเลยว่าทริกเกอร์เป็นสาเหตุของปัญหาและผู้พัฒนาฐานข้อมูลที่มีความสามารถควรทำเช่นนั้น การวางกฎเกณฑ์ทางธุรกิจเฉพาะในแอปพลิเคชันคือสาเหตุอันดับหนึ่งที่ฉันพบข้อมูลที่ไม่ดีเนื่องจากผู้อื่นไม่รู้ว่ากฎนั้นมีอยู่จริงและละเมิดในกระบวนการของพวกเขา กฎที่เป็นศูนย์กลางข้อมูลอยู่ในฐานข้อมูลและทริกเกอร์เป็นกุญแจสำคัญในการบังคับใช้กฎที่ซับซ้อนมากขึ้น


กฎที่เน้นข้อมูลเป็นศูนย์กลางอยู่ในฐานข้อมูล
absin

มีฉันsome programmers are too ethnocentric to consider that something other than their prized application may be affecting things
Kid101

13

ส่วนใหญ่ใช่

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

มันสร้างเลเยอร์ของความซับซ้อนซึ่งเพิ่งเพิ่มงานบำรุงรักษา

แทนที่จะใช้ทริกเกอร์กระบวนงาน / ชุดคำสั่งที่เก็บไว้โดยทั่วไปสามารถทำสิ่งเดียวกัน แต่ในลักษณะที่ชัดเจนและบำรุงรักษา - การเรียกชุดคำสั่งที่เก็บไว้หมายความว่านักพัฒนาสามารถดูซอร์สโค้ดของมันและดูว่าเกิดอะไรขึ้น


12
นี่คือข้อดีของทริกเกอร์ไม่ใช่ความเสียเปรียบ! procs ที่เก็บไว้ไม่สามารถรับประกันได้ว่าจะเรียกใช้สำหรับการเปลี่ยนแปลงข้อมูลทุกครั้ง มีหลายวิธีที่ข้อมูลสามารถเปลี่ยนแปลงได้นอกเหนือจาก GUI
HLGEM

2
HLGEM ขึ้นอยู่กับการควบคุมการเข้าถึงของคุณ คุณสามารถปฏิเสธการแก้ไขใด ๆ ในตารางโดยตรงยกเว้นผ่านขั้นตอนการจัดเก็บ
Rbjz

1
ฉันคิดว่าประเด็นคือถ้าตัวอย่างเช่นระเบียนในสองตารางควรถูกสร้างและทำลายไปพร้อมกันเสมอไม่ว่าคุณจะเข้าถึงฐานข้อมูลได้อย่างไรและไม่ว่าคุณจะเป็นใครหรือมีสิทธิ์ใดที่คุณมีอยู่ . ข้อเท็จจริงที่ว่ามันเป็นไปได้ที่จะกำหนดสิทธิ์มากเกินไปหรือไม่ถูกต้องและคาดว่าคนจะรู้ว่าต้องใช้ขั้นตอนใดในการจัดเก็บหมายความว่าฐานข้อมูลมีความเสี่ยงที่จะสูญเสียความสมบูรณ์ มันเหมือนกับความสัมพันธ์ที่สำคัญกับต่างประเทศ มันเป็นระบบฐานข้อมูลที่ดีที่สุดและเชื่อถือได้มากที่สุด
Triynko

2
หากควรสร้างหรือทำลายบันทึกร่วมกันให้สร้างข้อ จำกัด การตรวจสอบเพื่อให้แน่ใจว่าเป็น ด้วยวิธีนี้คนที่ฝ่าฝืนกฎจะได้รับข้อผิดพลาดแทนที่จะเป็นพฤติกรรมที่ซ่อนเร้นซึ่งทำให้สิ่งต่าง ๆ อย่างน่าอัศจรรย์โดยปราศจากความรู้หรือความยินยอม
MarkR

9

ทริกเกอร์มีประสิทธิภาพและมีประโยชน์อย่างมากมีจำนวนสถานการณ์ที่ทริกเกอร์เป็นทางออกที่ดีที่สุดสำหรับปัญหา

พวกเขายังเป็นเครื่องมือ "แฮ็ค" ที่ดีมาก มักจะมีสถานการณ์ที่คุณไม่ได้ควบคุมทั้งรหัสและฐานข้อมูลทันที หากคุณต้องรอ 2 เดือนสำหรับการออกรุ่นใหญ่ครั้งต่อไปของคุณ แต่คุณสามารถนำ patch ไปใช้กับฐานข้อมูลของคุณได้ทันทีจากนั้นคุณสามารถวางทริกเกอร์บนโต๊ะเพื่อทำหน้าที่เพิ่มเติม จากนั้นเมื่อการปล่อยรหัสเป็นไปได้คุณสามารถแทนที่ทริกเกอร์นี้ด้วยฟังก์ชั่นการใช้รหัสเดียวกันหากต้องการ

ในตอนท้ายของวันทุกอย่าง "ชั่วร้าย" ถ้าคุณไม่รู้ว่ามันกำลังทำอะไรอยู่ การตัดสินใจทริกเกอร์นั้นเป็นเพราะมีนักพัฒนาที่ไม่เข้าใจพวกเขาเหมือนกับการโต้เถียงว่ารถยนต์นั้นชั่วร้ายเพราะบางคนไม่สามารถขับ ...


7

ทริกเกอร์มีการใช้งานของพวกเขา - การบันทึก / ตรวจสอบและการบำรุงรักษาวันที่ "แก้ไขล่าสุด" เป็นสองการใช้งานที่ดีมากซึ่งได้รับการกล่าวถึงในการตอบกลับก่อนหน้านี้

อย่างไรก็ตามหนึ่งในหลักสำคัญของการออกแบบที่ดีคือกฎเกณฑ์ทางธุรกิจ / ตรรกะทางธุรกิจ / สิ่งที่คุณต้องการเรียกว่าควรรวมอยู่ในที่เดียว การวางตรรกะบางอย่างในฐานข้อมูล (ผ่านทริกเกอร์หรือ procs ที่เก็บไว้) และบางอย่างในแอปพลิเคชันละเมิดหลักการดังกล่าว การทำซ้ำตรรกะในทั้งสองแห่งนั้นแย่ยิ่งกว่าเดิมเพราะพวกเขาจะไม่ซิงค์กัน

นอกจากนี้ยังมีปัญหา "หลักการของความประหลาดใจน้อยที่สุด" ที่ได้รับการกล่าวถึงแล้ว


3
ถูกต้องแล้วควรอยู่ในที่เดียวคือฐานข้อมูล ตรรกะที่มีผลต่อความสมบูรณ์ของข้อมูลจะต้องอยู่ในฐานข้อมูลเสมอและไม่เคยอยู่ในแอปพลิเคชันที่อาจมีหรือไม่มีการเรียกเมื่อมีผลต่อข้อมูลในฐานข้อมูล
HLGEM

1
@HLGEM: ขึ้นอยู่กับว่าฐานข้อมูลสามารถเข้าถึงข้อมูลที่อนุญาตให้บอกได้หรือไม่ว่าข้อมูลนั้นถูกต้อง มันไม่ได้เป็นอย่างนั้นเสมอไป เมื่อตัวตรวจสอบความถูกต้องอยู่ในองค์กรอื่น (เช่นสำหรับรายละเอียดบัตรเครดิตหรือบัญชีธนาคาร) ฐานข้อมูลจะไม่ทราบว่ามันถูกต้องหรือไม่สมมติว่านี่ไม่ใช่ DB ของธนาคาร! - และมันจะต้องพึ่งพาแอปพลิเคชันสำหรับการบังคับใช้ สิ่งที่คุณไม่ต้องการคือการให้ฐานข้อมูลที่ทำการเชื่อมต่อแบบสุ่มไปยังบริการของบุคคลที่สามเนื่องจากไม่ดีเมื่อมาถึงการปรับใช้เซิร์ฟเวอร์
Donal Fellows

@HLGEM: ในขณะที่ฉันยังไม่พร้อมที่จะแยกแยะตัวเลือกในการใส่ตรรกะของแอปพลิเคชันทั้งหมดลงในฐานข้อมูลได้อย่างสมบูรณ์ แต่ฉันพบว่ามันทำงานได้ดีกว่าที่จะวางไว้ที่อื่นโดยทั่วไปเป็นชั้น OO ฐานข้อมูล ตราบใดที่แอปของคุณเข้าถึงฐานข้อมูลผ่านเลเยอร์วัตถุการรับประกันแบบเดียวกันกับลอจิกจะถูกเรียกใช้เสมอ
Dave Sherohman

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

@HLGEM ด้วยเหตุผลอย่างนั้นฉันจึงกำลังทำงานกับส่วนขยายของ ORM ของเราเพื่อให้ทำงานเหมือนกับทริกเกอร์โดยใช้เซ็ตการแก้ไขทุกอย่างภายในธุรกรรม รู้สึกโง่เล็กน้อย แต่จะป้องกันไม่ให้เรามีตรรกะทางธุรกิจทั้งหมดของเราในแอปพลิเคชันยกเว้นบางครั้งไม่ใช่ (เพียงไม่กี่ตารางเท่านั้นที่จำเป็นต้องอัปเดตจำนวนมาก) นอกจากนี้ยังจะช่วยให้นักพัฒนาทั้งหมดสามารถเขียนและใช้พวกเขาในภาษาที่พวกเขารู้สึกสบายใจที่สุดและมีการเข้าถึงสิ่งที่เป็นนามธรรมของวัตถุที่เราสร้างขึ้น
Adamantish

6

ทริกเกอร์เป็นเครื่องมือที่ดีเมื่อใช้อย่างถูกต้อง โดยเฉพาะอย่างยิ่งสำหรับสิ่งต่าง ๆ เช่นการตรวจสอบการเปลี่ยนแปลงการเติมตารางการสรุป ฯลฯ

ตอนนี้พวกเขาสามารถเป็น "ความชั่วร้าย" ได้ถ้าคุณจบลงที่ "ทริกเกอร์นรก" ด้วยทริกเกอร์ตัวเดียวที่เริ่มต้นทริกเกอร์อื่น ฉันเคยทำงานกับผลิตภัณฑ์ COTS ซึ่งพวกเขามีสิ่งที่เรียกว่า "ตัวกระตุ้นยืดหยุ่น" ทริกเกอร์เหล่านี้ถูกเก็บไว้ในตารางเนื่องจาก stings sql แบบไดนามิกถูกรวบรวมทุกครั้งครั้งที่ถูกประมวลผล ทริกเกอร์ที่คอมไพล์จะทำการค้นหาและดูว่าตารางนั้นมีทริกเกอร์เฟล็กใด ๆ ให้เรียกใช้จากนั้นรวบรวมและเรียกใช้ทริกเกอร์ "flex" ในทางทฤษฎีสิ่งนี้ฟังดูเป็นไอเดียที่เจ๋งจริงๆเพราะผลิตภัณฑ์นั้นถูกปรับแต่งได้ง่าย แต่ความจริงก็คือฐานข้อมูลนั้นค่อนข้างจะระเบิดเพราะคอมไพล์ทั้งหมดที่มันต้องทำ ...

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


6

ในระดับสูงมีสองกรณีใช้งานสำหรับทริกเกอร์ 1

1) เพื่อให้สิ่งที่ "อัตโนมัติ" เกิดขึ้น ในกรณีนี้ทริกเกอร์ทำให้เกิดผลข้างเคียงพวกมันจะเปลี่ยนข้อมูลในรูปแบบที่ไม่คาดคิดเนื่องจากตัวดำเนินการ (ดั้งเดิม) แทรกอัปเดตหรือลบที่ถูกเรียกใช้และทำให้ทริกเกอร์เริ่มทำงาน

ฉันทามติทั่วไปที่นี่เป็นตัวกระตุ้นที่เป็นอันตรายแน่นอน เนื่องจากพวกเขาเปลี่ยนซีแมนทิกส์ที่รู้จักกันดีของคำสั่ง INSERT, UPDATE หรือ DELETE การเปลี่ยนซีแมนทิกส์ของตัวดำเนินการ SQL ดั้งเดิมสามตัวนี้จะกัดผู้พัฒนารายอื่น ๆ ซึ่งในอนาคตจำเป็นต้องทำงานบนตารางฐานข้อมูลของคุณซึ่งจะไม่ทำงานในลักษณะที่คาดหวังอีกต่อไปเมื่อดำเนินการกับ SQL ดั้งเดิม

2) เพื่อบังคับใช้กฎความสมบูรณ์ของข้อมูลนอกเหนือจากกฎที่เราสามารถจัดการได้อย่างชัดเจน (โดยใช้ CHECK, คีย์หลัก, UNIQUE KEY และ FOREIGN KEY) ในกรณีใช้งานทริกเกอร์ทั้งหมดจะเป็นข้อมูล QUERY (SELECT) เพื่อตรวจสอบว่าอนุญาตให้ทำการเปลี่ยนแปลง INSERT / UPDATE / DELETE หรือไม่ เช่นเดียวกับข้อ จำกัด ที่เปิดเผยทำให้เรา เฉพาะในกรณีนี้เรา (ผู้พัฒนา) ได้ตั้งโปรแกรมการบังคับใช้

การใช้ทริกเกอร์สำหรับกรณีใช้หลังไม่เป็นอันตราย

ฉันบล็อกที่: http://harmfultriggers.blogspot.com


เมื่อใช้ทริกเกอร์สำหรับความสมบูรณ์ของการอ้างอิงมันยากกว่าที่จะจัดการกับปัญหาที่เกิดขึ้นพร้อมกัน
WW

2
ตกลง แต่มันจะง่ายขึ้นเมื่อใช้วิธีอื่น?
Toon Koppelaars

ฉันจะโต้แย้งหมายเลขหนึ่งจะเป็นอันตรายหากคุณมีนักพัฒนาที่ไร้ความสามารถ
HLGEM

มีนักพัฒนาที่ไร้ความสามารถมากมายถึงแม้ว่าฮ่า ๆ ๆ
hashtable

5

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

อย่างไรก็ตามฉันเห็นด้วยกับ MarkR อย่างสมบูรณ์ - คุณสามารถ (เกือบ) เขียนโค้ดที่มีฟังก์ชันเทียบเท่ากับทริกเกอร์ที่จะฉลาดกว่าและง่ายต่อการบำรุงรักษา


ยกเว้นว่าจะไม่ทำงานทั้งหมดในการเข้าถึงฐานข้อมูลที่ไหลผ่านรหัสแอปพลิเคชัน
HLGEM

5

ไม่ใช่ความชั่วร้าย พวกเขาทำให้สิ่งต่าง ๆ ง่ายขึ้นเช่น

1.Logging / ตรวจสอบการเปลี่ยนแปลงเรคคอร์ดหรือแม้แต่สคีมาฐานข้อมูล

คุณอาจมีทริกเกอร์ใน ALTER TABLE ที่ย้อนกลับการเปลี่ยนแปลงในสภาพแวดล้อมการผลิตของคุณ สิ่งนี้ควรป้องกันการดัดแปลงตารางโดยไม่ตั้งใจ


2. บังคับ intrgrity อ้างอิง (ความสัมพันธ์หลัก / ต่างประเทศคีย์ ฯลฯ ) ในฐานข้อมูลหลาย ๆ


คุณสามารถย้อนกลับคำสั่ง DDL ได้หรือไม่
Andrew Swan

โดยทั่วไปไม่ได้ วิธีเดียวที่จะหยุดการทำงานนั่นคือการลบการอนุญาตนั้นออกจากการเข้าสู่ระบบของผู้ใช้
jmucchiello

ในเอ็นจิ้นฐานข้อมูลบางตัวคุณสามารถ (เช่น PostgreSQL)
Nicolás

@Andrew - ใน SQL Server คุณสามารถ SQL Server 2005+ ยังมี DDL ที่ทำให้เกิดเหตุการณ์เช่นALTER TABLEนั้นขึ้น
Martin Smith

4

ไม่พวกเขาไม่ใช่คนชั่ว - พวกเขาแค่เข้าใจผิด :-D

ทริกเกอร์มีการใช้งานที่ถูกต้อง แต่บ่อยครั้งที่การแฮ็กย้อนยุคทำให้สิ่งเลวร้ายลงในที่สุด

หากคุณกำลังพัฒนาฐานข้อมูลเป็นส่วนหนึ่งของแอปพลิเคชันตรรกะควรจะอยู่ในรหัสหรือสโทรที่โทรมา ทริกเกอร์จะนำไปสู่การแก้ไขข้อบกพร่องในภายหลัง

หากคุณเข้าใจว่าการล็อกการเดดล็อกและวิธีการเข้าถึงไฟล์บนดิสก์จากนั้นใช้ทริกเกอร์ในวิธีที่ถูกต้อง (เช่นการตรวจสอบหรือการเก็บถาวรการเข้าถึงฐานข้อมูลโดยตรง) นั้นมีประโยชน์


4

การพูดว่าพวกเขาชั่วร้ายนั้นเป็นสิ่งที่น่าตื่นเต้น แต่พวกเขาสามารถทำให้เกิดตาข่ายได้ เมื่อการยิงทริกเกอร์หนึ่งทำให้ทริกเกอร์อื่น ๆ ยิงมันซับซ้อนมาก สมมติว่าพวกเขาลำบาก: http://www.oracle.com/technology/oramag/oracle/08-sep/o58asktom.html

การทำตรรกะทางธุรกิจใน Oracle ด้วยทริกเกอร์นั้นยากกว่าที่คิดเพราะมีปัญหาหลายอย่างพร้อมกัน คุณไม่เห็นการเปลี่ยนแปลงในเซสชั่นอื่นจนกว่าเซสชันอื่นจะทำ


4

พวกเขาไม่ได้ชั่วร้ายอย่างแน่นอน ฉันพบทริกเกอร์ที่มีค่าในระหว่างการ refactoring schema ของฐานข้อมูลในขณะที่เปลี่ยนชื่อคอลัมน์หรือแบ่งคอลัมน์ออกเป็นสองคอลัมน์หรือในทางกลับกัน (ตัวอย่างเช่น: ชื่อ / นามสกุลตัวพิมพ์) และช่วยการเปลี่ยนแปลง

พวกเขายังมีประโยชน์มากสำหรับการตรวจสอบ


4

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

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

ตัวอย่างที่ให้ไว้ใน BOL ภายใต้หัวข้อ "การจัดการความปลอดภัย Trigger " เป็นของผู้ใช้ที่สร้างทริกเกอร์ที่มีรหัสGRANT CONTROL SERVER TO JohnDoe ;เพื่อเพิ่มสิทธิ์ของตัวเอง


3

หากมีผลข้างเคียงแสดงว่าเป็นปัญหาจากการออกแบบ ในระบบฐานข้อมูลบางระบบไม่มีความเป็นไปได้อื่นที่จะตั้งค่าฟิลด์การสร้างอัตโนมัติเช่นสำหรับฟิลด์ ID คีย์หลัก


3

ฉันคิดว่าพวกเขาสามารถเป็นคนชั่วร้าย แต่เป็นเพียงสิ่งชั่วร้ายที่จะพัฒนา

แม้ว่าฉันจะไม่ได้มีประสบการณ์กับพวกเขามากนัก แต่ก็มีพวกเขาในโครงการล่าสุดที่ฉันทำงานซึ่งทำให้ฉันได้ข้อสรุปนี้ ปัญหาที่ฉันมีกับพวกเขาคือพวกเขาสามารถทำให้ตรรกะทางธุรกิจสิ้นสุดลงในสองที่คือไลบรารีรหัสและฐานข้อมูล

ฉันเห็นว่ามันเป็นอาร์กิวเมนต์ที่คล้ายกันกับการใช้ sprocs คุณมักจะมีนักพัฒนาซอฟต์แวร์ที่เก่งในการเขียนตรรกะทางธุรกิจลงในฐานข้อมูลในขณะที่คนที่ไม่ได้มีตรรกะทางธุรกิจที่อื่น

ดังนั้นกฏของฉันคือดูว่าโครงสร้างของโครงการของคุณคืออะไร หากดูเหมือนว่าจะมีตรรกะทางธุรกิจที่เก็บไว้ในฐานข้อมูลก็อาจมีประโยชน์ที่จะมีทริกเกอร์


1

แท้จริงแล้วทริกเกอร์มักถูกนำไปใช้ในทางที่ผิด จริงๆแล้วในกรณีส่วนใหญ่คุณไม่จำเป็นต้องใช้ แต่นั่นไม่ได้ทำให้พวกเขาจำเป็นต้องเลวร้าย

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


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