ใน SQL เซิร์ฟเวอร์ทริกเกอร์มีสองประเภท:
ทริกเกอร์ที่ดำเนินการหลังจากเหตุการณ์ที่เกิดขึ้นกับตาราง ( อะนาล็อกที่สมบูรณ์ขั้นตอนเหตุการณ์ใน Visual Basic);
ทริกเกอร์ที่ดำเนินการแทนเหตุการณ์ที่เกิดขึ้นในตาราง ในกรณีนี้ เหตุการณ์ (เพิ่ม เปลี่ยนแปลง หรือ กำลังลบรายการ) ไม่ได้ถูกดำเนินการ แต่ถูกดำเนินการแทน คำสั่ง SQLระบุไว้ภายในทริกเกอร์
ทริกเกอร์ประเภทแรกใช้เพื่อประมวลผลเหตุการณ์ตาราง และทริกเกอร์ประเภทที่สองใช้เพื่อจัดเตรียม ความสมบูรณ์ของข้อมูลนั่นคือ กำลังลบรายการจากตารางรองเมื่อบันทึกที่เกี่ยวข้องถูกลบออกจากตารางหลัก
ความคิดเห็น: ทริกเกอร์ถูกสร้างขึ้นสำหรับตารางเฉพาะและดำเนินการโดยอัตโนมัติหากมีเหตุการณ์ (เพิ่ม เปลี่ยนแปลง หรือเปลี่ยนแปลง) เกิดขึ้นบนตารางที่ถูกสร้างขึ้น กำลังลบรายการ).
หากต้องการสร้างทริกเกอร์บนแท็บคำขอใหม่ คุณต้องพิมพ์คำสั่ง CREATE สิ่งกระตุ้นโดยมีดังต่อไปนี้ ไวยากรณ์:
สร้างทริกเกอร์<Имя триггера>
บน<Имя таблицы>
สำหรับ
เช่น<Команды SQL>
ชื่อทริกเกอร์คือชื่อของทริกเกอร์ที่จะสร้าง
ชื่อตาราง - ชื่อตารางซึ่งทริกเกอร์ถูกสร้างขึ้น
หากใช้พารามิเตอร์ AFTER ทริกเกอร์จะถูกดำเนินการหลังจากเหตุการณ์ และหากใช้พารามิเตอร์ INSTEAD OF ทริกเกอร์จะถูกดำเนินการแทนเหตุการณ์
พารามิเตอร์ INSERT, UPDATE และ DELETE จะกำหนดเหตุการณ์ที่ (หรือแทนที่) ทริกเกอร์ถูกดำเนินการ
ด้วยพารามิเตอร์การเข้ารหัส - ตั้งใจที่จะเปิดใช้งาน การเข้ารหัสข้อมูลที่ ทริกเกอร์การดำเนินการ.
คำสั่ง SQL คือคำสั่ง SQL ที่จะดำเนินการเมื่อมีการเรียกใช้ทริกเกอร์
มาดูตัวอย่างการสร้างทริกเกอร์ต่างๆ สำหรับตารางกัน "นักเรียน".
ตัวอย่าง: สร้างสรรค์ สิ่งกระตุ้น "การเพิ่ม"เพื่อแสดงข้อความบนหน้าจอ "บันทึกเพิ่ม"เมื่อเพิ่มบันทึกใหม่ลงในตาราง "นักเรียน"
สร้างการเพิ่มทริกเกอร์
บน นักเรียน
สำหรับหลังจากใส่
AS PRINT "บันทึกเพิ่ม"
ตัวอย่าง: สร้างสรรค์ สิ่งกระตุ้น "เปลี่ยน" "รายการมีการเปลี่ยนแปลง"ที่ การเปลี่ยนแปลงบันทึกในตาราง "นักเรียน"
สร้างการเปลี่ยนแปลงทริกเกอร์
บน นักเรียน
สำหรับภายหลังการอัพเดต
AS PRINT "บันทึกถูกแก้ไข"
ตัวอย่าง: สร้างสรรค์ สิ่งกระตุ้น "ลบ"เพื่อแสดงข้อความบนหน้าจอ "บันทึกถูกลบ"เมื่อลบบันทึกออกจากตาราง "นักเรียน"
สร้างทริกเกอร์ ลบ
บน นักเรียน
สำหรับหลังจากลบ
AS PRINT "บันทึกถูกลบ"
ตัวอย่าง: ใน ในตัวอย่างนี้แทนที่จะเอานักเรียนออกจากโต๊ะ "นักเรียน"รหัสระหว่าง BEGIN และ END จะถูกดำเนินการ ประกอบด้วยคำสั่ง DELETE สองคำสั่ง อันดับแรก ทีมลบบันทึกทั้งหมดออกจากตาราง "เกรด"ซึ่งเชื่อมโยงกับบันทึกจากตาราง "นักเรียน"- นั่นก็คือใครมี. เกรด[รหัสนักศึกษา]เท่ากับรหัสของนักศึกษาที่ถูกถอดออก แล้วจากโต๊ะ. "นักเรียน"ตัวนักเรียนเองก็ถูกถอดออก
สร้างทริกเกอร์ การลบนักเรียน
บน นักเรียน
แทนที่จะลบ
ลบการให้คะแนน
WHERE ลบแล้ว[รหัสนักเรียน]=เกรด[รหัสนักเรียน]
ลบนักเรียน
WHERE ลบแล้ว[รหัสนักเรียน]=นักเรียน[รหัสนักเรียน]
ความคิดเห็น: ที่นี่จะถูกลบ การบันทึกแสดงด้วยคำเสริมที่ถูกลบ
ความคิดเห็น: เพื่อให้มั่นใจ ความสมบูรณ์ของข้อมูลทริกเกอร์มักจะใช้ร่วมกับไดอะแกรม แต่เราสามารถใช้ทริกเกอร์ดังกล่าวโดยไม่มีไดอะแกรม แต่เราไม่สามารถใช้ไดอะแกรมโดยไม่มีทริกเกอร์ได้
ทริกเกอร์คือขั้นตอนที่จัดเก็บไว้ในเซิร์ฟเวอร์ในรูปแบบที่คอมไพล์ และดำเนินการโดยอัตโนมัติเมื่อมีเหตุการณ์การเพิ่ม แก้ไข หรือลบบันทึกเกิดขึ้น โดยไม่คำนึงถึงความต้องการของลูกค้า คุณไม่สามารถบังคับให้ทริกเกอร์ทำงานจากแอปพลิเคชันไคลเอนต์ได้ ไม่สามารถผ่านทริกเกอร์ได้ พารามิเตอร์อินพุตและรับพารามิเตอร์เอาต์พุตจากมัน
ทริกเกอร์ใช้งานได้เสมอ ปัจจุบันบันทึกและดำเนินการตามการกระทำเฉพาะ
ทริกเกอร์สามารถดำเนินการได้ก่อนที่เหตุการณ์จะเกิดขึ้น (parameter ก่อน)หรือหลังเกิดเหตุการณ์ (parameter หลังจาก).
ทริกเกอร์มีความโดดเด่นตามทิศทางของการกระทำ:
- แทรก -เพื่อเพิ่มรายการ;
- อัปเดต- เพื่อแก้ไขบันทึก;
- ลบ- เพื่อลบบันทึก
ทริกเกอร์ถูกสร้างขึ้นสำหรับตารางเฉพาะและเป็นของตารางนั้น หากตารางมีทริกเกอร์หลายตัวในทิศทางเดียวกัน เวลาตอบสนองจะถูกกำหนดโดยพารามิเตอร์เป็นหลัก ก่อนและ หลังจากและเมื่อใด ค่าเดียวกันพารามิเตอร์การเกิดเหตุการณ์ - พารามิเตอร์ ตำแหน่งระบุหมายเลข (ลำดับ) ของทริกเกอร์
เมื่อทำงานกับทริกเกอร์ โปรดจำไว้ว่า:
- เมื่อย้อนกลับธุรกรรม การเปลี่ยนแปลงทั้งหมดที่ทำโดยทริกเกอร์จะถูกย้อนกลับ
- การเปลี่ยนแปลงแบบเรียงซ้อนและการลบแบบเรียงซ้อนในตารางลูกนั้นสามารถนำไปใช้ได้อย่างง่ายดาย
- การเปลี่ยนแปลงที่ทำกับเนื้อความของทริกเกอร์จะทำงานโดยอัตโนมัติสำหรับแอปพลิเคชันไคลเอนต์แต่ละรายการ กล่าวคือ ไม่จำเป็นต้องสื่อสารการเปลี่ยนแปลงที่ทำกับผู้ใช้แต่ละคน
ทริกเกอร์ถูกสร้างขึ้นตามกฎสำหรับการสร้างขั้นตอนการจัดเก็บแม้ว่าจะมีคุณสมบัติพิเศษบางอย่างก็ตาม
กำลังสร้างทริกเกอร์
หากต้องการสร้างทริกเกอร์ ให้ใช้โอเปอเรเตอร์ สร้างทริกเกอร์
รูปแบบตัวดำเนินการ
สร้างทริกเกอร์ สำหรับ
[ คล่องแคล่ว | ไม่ใช้งาน ]
[ ก่อน|หลังจาก]
[แทรก | อัปเดต ลบ ]
[ ตำแหน่ง ]
วัตถุประสงค์ของตัวเลือก:
คล่องแคล่ว- ทริกเกอร์ทำงานอยู่ เช่น เมื่อเข้าถึงตารางที่ระบุ ขั้นตอนที่เขียนใน stele ทริกเกอร์จะถูกดำเนินการ
ไม่ได้ใช้งาน- ทริกเกอร์เป็นแบบพาสซีฟ เช่น ทริกเกอร์ถูกสร้างและเก็บไว้บนเซิร์ฟเวอร์ แต่เมื่อเข้าถึงตารางที่ระบุ องค์ประกอบทริกเกอร์> จะไม่ถูกดำเนินการ
ก่อน- ถึงการเกิดขึ้นของเหตุการณ์;
หลังจาก -กำหนดเวลาตอบสนอง หลังจากการเกิดขึ้นของเหตุการณ์;
แทรก -กำหนดทริกเกอร์เหตุการณ์การเพิ่มบันทึกลงในตาราง
อัปเดต -กำหนดเหตุการณ์การแก้ไขบันทึกในตารางสำหรับทริกเกอร์
ลบ -กำหนดทริกเกอร์เหตุการณ์การลบบันทึกออกจากตาราง
ตำแหน่ง -กำหนดหมายเลขทริกเกอร์ (ตำแหน่ง) ภายในเหตุการณ์ทริกเกอร์เฉพาะ (ก่อนหรือ หลังจาก).
เพื่ออธิบายขั้นตอนทริกเกอร์ จะมีการใช้ตัวดำเนินการและโครงสร้างเดียวกันกับที่ใช้ในการสร้างขั้นตอนการจัดเก็บ ส่วนหัวของทริกเกอร์จะกำหนดกิจกรรม เหตุการณ์การเริ่มทำงาน การดำเนินการที่ทริกเกอร์ตอบสนอง และตำแหน่งการยิงของทริกเกอร์ (ไม่บังคับ)
เมื่อเขียน trigger stele> คุณสามารถใช้คำหลักเพิ่มเติมได้ เก่า(ก่อนวันงาน) และ ใหม่(หลังงาน) ตามด้วยชื่อสนาม
เนื่องจากในฐานข้อมูลระยะไกลการเปลี่ยนแปลงทั้งหมดในตาราง (การเพิ่ม การแก้ไข และการลบบันทึก) จะเกิดขึ้นในกลุ่มตัวอย่าง (ใน RAM) ดังนั้น ตัวอย่างเช่น เมื่อเปลี่ยนค่าของฟิลด์ คุณสามารถอ้างถึงฟิลด์เก่า (ก่อนการเปลี่ยนแปลง) ค่า - ฟิลด์ OLO.simya> และค่าใหม่ (หลังการเปลี่ยนแปลง) ของฟิลด์ - NEW-fields sim หากไม่มีการเปลี่ยนแปลงใด ๆ กับฟิลด์ที่ระบุ ดังนั้น ObO.fields-name> จะเท่ากับ NEW.chmb สาขา
ตัวอย่างที่ 6.10กำลังสร้างทริกเกอร์
สร้างทริกเกอร์ T_COMPCODE สำหรับผู้แต่ง
ใช้งานก่อนแทรกตำแหน่ง 0
new.code_composer=gen_id(g_composers, 1); ถ้า (COMPOSERS.data เกิดไม่เป็นโมฆะ) ให้เริ่มต้น
new.actuallyage = (นักแสดง ("ตอนนี้" ณ วันที่) -COMPOSERS.data_born)/365; ถ้า (COMPOSERS.data วันไม่เป็นโมฆะ) ดังนั้น COM POSERS.age =(COMPOSERS.data_day-COMPOSERS.data เกิด) /365; อย่างอื่น new.age=null; จบ
ทริกเกอร์เริ่มทำงานก่อนเหตุการณ์เพิ่มบันทึกใหม่และคำนวณอายุของผู้แต่ง อายุที่คำนวณได้จะถูกเขียนลงในฟิลด์ "อันที่จริง_อายุ».
ทริกเกอร์การเปลี่ยนแปลง
หากต้องการเปลี่ยนทริกเกอร์ให้ใช้คำสั่ง เปลี่ยนทริกเกอร์ซึ่งมีรูปแบบและหลักการทำงานคล้ายคลึงกับคำสั่ง เปลี่ยนแปลงขั้นตอนเพื่อเปลี่ยนเนื้อความของกระบวนงานที่เก็บไว้
รูปแบบคำสั่ง
เปลี่ยนทริกเกอร์ สำหรับ [ คล่องแคล่วฉัน ไม่ได้ใช้งาน
ก่อนฉัน หลังจาก
แทรกฉัน อัปเดต ลบ
[ ตำแหน่ง 1
หลังจากดำเนินการตามคำสั่งแล้ว เปลี่ยนทริกเกอร์คำจำกัดความทริกเกอร์เก่าถูกแทนที่ด้วยคำจำกัดความใหม่ ไม่สามารถกู้คืนข้อกำหนดทริกเกอร์เก่าได้
ตัวอย่างที่ 6.11การแก้ไขทริกเกอร์
เปลี่ยนทริกเกอร์ T_COMPCODE สำหรับผู้แต่งที่ใช้งานอยู่ก่อนที่จะแทรกตำแหน่ง 5 เป็น
new.code_composer=gen_id(g_composers, 1); ถ้า (COMPOSERS.data_born ไม่ใช่ null) ให้เริ่มต้น
new.actually_age = (นักแสดง ("ตอนนี้" ณ วันที่)-COMPOSERS.data_born)/365; ถ้า (COM POSERS.dataday ไม่ใช่ null) ดังนั้น COM POSERS.age =
(COMPOSERS.data_day-COMPOSERS.data เกิด) /365; อย่างอื่น new.age=null; จบ
อย่างอื่นเริ่มต้น new.age=null; ใหม่.actually_age=null; สิ้นสุดสิ้นสุด
ทริกเกอร์ที่สร้างขึ้นในตัวอย่างที่ 6.10 ได้รับการแก้ไขเพื่อรวมตำแหน่งใหม่ ( ตำแหน่ง) การเปิดใช้งานทริกเกอร์ - 5
การถอดทริกเกอร์
หากต้องการลบทริกเกอร์ให้ใช้คำสั่ง
ตัวอย่างที่ 6.12การถอดทริกเกอร์
วางทริกเกอร์ T_COMPCODE
ทริกเกอร์ที่ถูกลบไม่สามารถกู้คืนได้
การใช้ทริกเกอร์ในการดำเนินการแบบเรียงซ้อน
ตามที่ระบุไว้ข้างต้น เอฟเฟกต์แบบเรียงซ้อนมีสองประเภท: การเปลี่ยนแปลงแบบเรียงซ้อนและการลบแบบเรียงซ้อน ดังนั้น สำหรับแต่ละตารางหลัก คุณจะต้องจัดเตรียมทริกเกอร์สองตัว: ตัวหนึ่งสำหรับการเปลี่ยนแปลงแบบเรียงซ้อน ตัวที่สองสำหรับการลบแบบเรียงซ้อน ในกรณีนี้ เงื่อนไข Referential Integrity จะต้องถูกลบออก
ตัวอย่างที่ 6.13การลบเรคคอร์ดแบบเรียงซ้อน
เมื่อลบนามสกุลออกจากตารางหลัก แกมจำเป็นต้องลบนามสกุลที่เกี่ยวข้อง (ตามคีย์นามสกุล)
li) ในตารางย่อยทั้งหมด (ในตารางตัวอย่าง ผู้เขียนและ หนังสือ).
สร้างทริกเกอร์ DEL FAM สำหรับ FAM ที่ใช้งานอยู่
ลบจากผู้เขียน
โดยที่ FAM.KEYFAM = ผู้แต่ง คีย์แฟม; ลบออกจากหนังสือ
โดยที่ FAM.KEY FAM = BOOK.KEY FAM;
ตัวอย่างที่ 6.14การแก้ไขบันทึกแบบเรียงซ้อน
เมื่อค่าของฟิลด์คีย์เปลี่ยนแปลง (คีย์แฟม)ในตารางหลัก แฟมคุณต้องเปลี่ยนค่าที่เกี่ยวข้อง กุญแจต่างประเทศในตารางย่อยทั้งหมด (ในตารางตัวอย่าง ผู้แต่ง และ หนังสือ)
สร้างทริกเกอร์ UPD FAM สำหรับ FAM ที่ใช้งานอยู่
ก่อนอัปเดตเป็น
ถ้า (OLD.KEYFAM ใหม่.KEY FAM) ให้เริ่มต้น
อัปเดตผู้เขียนตั้งค่า KEY FAM = NEW.KEY FAM
WHERE KEY FAM - OLD.KEY FAM; UPDATE ชุดหนังสือ KEYFAM - N EW. คีย์แฟม
โดยที่ KEY FAM = OLD.KEY FAM;
คุณสมบัติของการใช้เอฟเฟกต์น้ำตก:
- เมื่อธุรกรรมถูกย้อนกลับ การเปลี่ยนแปลงทั้งหมดที่ทำโดยทริกเกอร์จะถูกส่งกลับไปยัง ค่าดั้งเดิม;
- ทริกเกอร์หนึ่งตัวสามารถเข้าถึงหลายตารางได้
- ทริกเกอร์สามารถเข้าถึงได้เท่านั้น ปัจจุบันรายการตาราง เช่น การย้ายไปยังรายการตารางอื่นเป็นสิ่งต้องห้าม
การรับรองความถูกต้องของข้อมูลโดยใช้ทริกเกอร์
เนื่องจากตารางหนึ่งสามารถมีทริกเกอร์ได้หลายตัวสำหรับเหตุการณ์เดียว (การเพิ่ม การแก้ไข หรือการลบบันทึก) จึงเป็นไปได้ที่จะมั่นใจในความน่าเชื่อถือของข้อมูลที่ป้อนลงในตาราง ในการสร้างทริกเกอร์เพื่อให้มั่นใจในความน่าเชื่อถือของข้อมูล จะมีการใช้โอเปอเรเตอร์และคำสำคัญเพิ่มเติม
ก. ตรวจสอบให้แน่ใจว่าค่าของฟิลด์ไม่ซ้ำกัน
ตามกฎแล้วเครื่องกำเนิดไฟฟ้าจะใช้เพื่อวัตถุประสงค์เหล่านี้ สำหรับการทำงานกับเครื่องกำเนิดไฟฟ้าดูย่อหน้าที่ 6.3 ตัวสร้างจะถูกสร้างขึ้นในขั้นแรก จากนั้นชื่อของตัวสร้างจะถูกระบุในส่วนเนื้อหาของทริกเกอร์
ตัวอย่างที่ 6.15กรอกข้อมูลในช่องคีย์หลัก
เขียนทริกเกอร์เพื่อเพิ่มค่าคีย์หลักที่ไม่ซ้ำ คีย์แฟม.เครื่องกำเนิดไฟฟ้า จีเอฟเอเอ็มได้ถูกสร้างขึ้นแล้ว
สร้างทริกเกอร์เพื่อสร้างกรอบให้กับครอบครัว
ใหม่. คีย์แฟม = GEN_ID(G_FAM, 1);
ตัวอย่างที่ 6.16กรอกข้อมูลในช่องข้อมูล
สร้างทริกเกอร์ TCOMPDATE สำหรับผู้แต่ง
ใช้งานก่อนอัปเดตตำแหน่ง 0
ถ้า (COMPOSERS.data เกิดไม่เป็นโมฆะ) ให้เริ่มต้น
new.actually_age = (นักแสดง ("ตอนนี้" AS
วันที่)-COMPOSERS.data_born)/365; ถ้า (วัน COMPOSERS.data ไม่เป็นโมฆะ) ดังนั้น COM POSERS.age =
(COM POSERS.data_day-COMPOSERS.data_born)/365; อย่างอื่น new.age=null; จบ
อย่างอื่นเริ่มต้น new.age=null; ใหม่.actually_age=null; จบ
ในตัวอย่างนี้ อายุของบุคคลจะถูกคำนวณและกรอกข้อมูลในฟิลด์ อายุจริงๆ
การบันทึกการตรวจสอบโดยใช้ทริกเกอร์
ในฐานข้อมูลระยะไกล การเก็บบันทึกการเปลี่ยนแปลงตารางฐานข้อมูลเพื่อระบุแหล่งที่มาของข้อมูลที่ไม่ถูกต้องถือเป็นเรื่องที่สนใจเป็นพิเศษ เมื่อเก็บบันทึกการเปลี่ยนแปลง ข้อมูลต่อไปนี้จะถูกบันทึกไว้ในตารางพิเศษ:
- ดำเนินการบนโต๊ะ
- ค่าฟิลด์ใหม่
- ค่าฟิลด์เก่า
- วันที่เปลี่ยนแปลง
- นามสกุล ชื่อ และนามสกุลของผู้ใช้ (ชื่อผู้ใช้);
- หมายเลขเวิร์กสเตชัน (ชื่อ)
ตัวอย่างที่ 6.17บันทึกการตรวจสอบเสร็จสิ้นโดยอัตโนมัติ
สร้างทริกเกอร์ AFTJNS_DOGS สำหรับสุนัขที่ใช้งานอยู่หลังจากแทรกตำแหน่ง 0 ตามที่เริ่มต้น
แทรกลงในค่าบันทึก (act, table_name,record_id) ("INSERT", "DOGS", DOGS. ID); จบ
สร้างทริกเกอร์ AFT_UPD_DOGS สำหรับสุนัขที่ใช้งานอยู่หลังจากอัปเดตตำแหน่ง 0 ตามที่เริ่มต้น
แทรกลงในค่าบันทึก (act, table_name, record_id) ('UPDATE', DOGS', DOGS.ID);
สร้างทริกเกอร์ AFT DEL DOGS สำหรับสุนัขที่ใช้งานอยู่หลังจากลบตำแหน่ง 0 AS
แทรกลงในค่าบันทึก (act,table_name,record_id) (’DELETE,”DOGS',DOGS.ID); จบ
ในตัวอย่างนี้สำหรับตาราง สุนัขมีการสร้างทริกเกอร์สามรายการ (หนึ่งรายการสำหรับแต่ละเหตุการณ์ แทรก อัปเดตและ ลบ).ทริกเกอร์แต่ละตัวจะเพิ่มลงในตารางการตรวจสอบ บันทึกหนึ่งบรรทัดที่มีฟิลด์ "ดำเนินการ", "ชื่อตาราง" และ "หมายเลขบันทึก" หากต้องการ คุณสามารถเพิ่มจำนวนฟิลด์ในตารางการตรวจสอบได้
การสร้างเครื่องกำเนิดไฟฟ้า
ตัวสร้างคือโปรแกรมที่จัดเก็บไว้ในฐานข้อมูลที่สร้างหมายเลขเฉพาะในแต่ละครั้งที่มีการเข้าถึง
การสร้างเครื่องกำเนิดไฟฟ้า:
สร้างเครื่องกำเนิดไฟฟ้า<Имя генератора>
ค่าเริ่มต้นระบุโดยคำสั่ง:
ชุดเครื่องกำเนิดไฟฟ้า<Имя генератора>ถึง<Начальное значение (целое число)>
สร้างเครื่องกำเนิดไฟฟ้า GenStore
ตั้งค่า GENERATOR GenStore เป็น 1
ตัวสร้างที่สร้างขึ้นนั้นเข้าถึงได้โดยใช้ฟังก์ชัน
GEN_ID(<Имя генератора>, <Шаг>)
ทริกเกอร์คือขั้นตอนที่อยู่บนเซิร์ฟเวอร์ฐานข้อมูลและจะถูกเรียกโดยอัตโนมัติเมื่อมีการแก้ไขบันทึกฐานข้อมูล เช่น เมื่อคอลัมน์มีการเปลี่ยนแปลงหรือเมื่อมีการลบหรือเพิ่ม ซึ่งแตกต่างจากขั้นตอนการจัดเก็บ ทริกเกอร์ไม่สามารถเรียกจากแอปพลิเคชันไคลเอ็นต์ และคุณไม่สามารถส่งพารามิเตอร์ไปยังทริกเกอร์หรือรับผลลัพธ์จากทริกเกอร์เหล่านั้นได้
การสร้างทริกเกอร์:
สร้างทริกเกอร์<>สำหรับ<>
(ก่อน | หลัง)
(อัปเดต | แทรก | ลบ)
เช่น<Тело триггера>
ตัวอธิบายที่ใช้งานอยู่ | INACTIVE กำหนดว่าทริกเกอร์ทำงานทันทีหลังจากสร้างขึ้นหรือไม่ ค่าเริ่มต้นคือ ใช้งานอยู่
ก่อนคำอธิบาย | AFTER ระบุช่วงเวลาที่ทริกเกอร์เริ่มทำงานก่อนหรือหลังการเกิดเหตุการณ์ที่เกี่ยวข้องซึ่งเกี่ยวข้องกับการเปลี่ยนแปลงบันทึก
คำอธิบาย UPDATE | แทรก | DELETE กำหนดว่าเหตุการณ์ใดที่ทริกเกอร์ทริกเกอร์ - เมื่อแก้ไข เพิ่ม หรือลบบันทึก
สำหรับเหตุการณ์หนึ่ง คุณสามารถสร้างทริกเกอร์ได้หลายตัว ซึ่งแต่ละทริกเกอร์จะถูกดำเนินการโดยอัตโนมัติ (หากอยู่ในสถานะใช้งานอยู่) หากมีทริกเกอร์หลายตัว ลำดับการเรียกใช้ (ดำเนินการ) จะถูกกำหนดโดยหมายเลขที่ระบุในตัวถูกดำเนินการ POSITION ทริกเกอร์จะดำเนินการตามลำดับจากน้อยไปมากของตัวเลขเหล่านี้
การลบทริกเกอร์:
ปล่อยทริกเกอร์<Имя триггера>
การเปลี่ยนแปลงทริกเกอร์:
ในการเข้าถึงค่าคอลัมน์ จะใช้คำแนะนำการจัดรูปแบบ:
เก่า.<Имя столбца>- หมายถึงของเก่า (ก่อนที่จะมีการเปลี่ยนแปลง) ค่าคอลัมน์,
ใหม่.<Имя столбца>- อ้างถึงค่าใหม่ (หลังการเปลี่ยนแปลง) ของคอลัมน์
การสร้างทริกเกอร์เพื่อเพิ่มค่าที่ไม่ซ้ำให้กับคอลัมน์หลัก
สร้างที่เก็บตาราง
(S_Code จำนวนเต็มไม่เป็นโมฆะ
คีย์หลัก(S_Code));
สร้างเครื่องกำเนิดไฟฟ้า GenStore
ตั้งค่า GENERATOR GenStore เป็น 1
สร้าง TRIGGER CodeStore สำหรับร้านค้า
ใหม่.S_Code = GEN_ID(GenStore, 1);
เมื่อมีการเพิ่มบันทึกใหม่ลงในตาราง Store คอลัมน์คีย์ S_Code สำหรับบันทึกนั้นจะได้รับการกำหนดค่าที่ไม่ซ้ำกันโดยอัตโนมัติ สามารถทำได้โดยการเรียก GEN_ID ไปยังตัวสร้าง GenStore
การดำเนินการลบเรคคอร์ดแบบเรียงซ้อนโดยใช้ทริกเกอร์
สร้างที่เก็บตาราง
(S_Code จำนวนเต็มไม่เป็นโมฆะ
คีย์หลัก(S_Code));
สร้างการ์ดตาราง
(C_Code จำนวนเต็มไม่เป็นโมฆะ
C_Code2 จำนวนเต็มไม่เป็นโมฆะ
คีย์หลัก (C_Code));
สร้างทริกเกอร์ DeleteStore สำหรับร้านค้า
ลบออกจากการ์ด โดยที่ Store.S_Code = Cards.C_Code2;
หลังจากลบรายการในตาราง Store รายการที่เกี่ยวข้องทั้งหมดในตารางการ์ดจะถูกลบโดยอัตโนมัติ
ความคิดเห็น: ตารางไม่ควรอยู่ภายใต้ข้อจำกัด Referential Integrity ที่ตั้งค่าไว้ที่ฟิสิคัลเลเยอร์
อัปเดตคอลัมน์ลิงก์ ( คอลัมน์สำคัญ) ของตารางที่เชื่อมโยง ซึ่งประกอบด้วยความจริงที่ว่าเมื่อค่าของคอลัมน์ลิงก์ของตารางหลักเปลี่ยนแปลง ค่าของคอลัมน์ลิงก์ของบันทึกที่เกี่ยวข้องทั้งหมดของตารางรองจะเปลี่ยนไปตามนั้น
สร้าง TRIGGER ChangeStore สำหรับร้านค้า
ถ้า(OLD.S_Code<>ใหม่.S_Code)
จากนั้นอัปเดตการ์ด
SET C_Code2 = ใหม่.S_Code
โดยที่ C_Code2 = OLD.S_Code;
เมื่อคุณเปลี่ยนคอลัมน์ S_Code ที่ใช้เชื่อมโยงตารางหลักของ Store กับตารางย่อยของการ์ด ค่าในคอลัมน์ลิงก์ C_Code2 ของบันทึกที่เกี่ยวข้องในตารางย่อยจะเปลี่ยนโดยอัตโนมัติ
เพื่อให้คอลัมน์ตารางหลักสามารถแก้ไขได้ จะต้องไม่สร้างคีย์สำหรับคอลัมน์นั้น
ทริกเกอร์ sql เป็นขั้นตอนการจัดเก็บชนิดพิเศษที่เซิร์ฟเวอร์ดำเนินการโดยอัตโนมัติเมื่อข้อมูล (DML) ในตารางเชื่อมโยงกับการเปลี่ยนแปลง ทริกเกอร์เชื่อมต่อกับตารางเฉพาะ การเปลี่ยนแปลงข้อมูลทั้งหมดที่กระทำโดยทริกเกอร์จะถือเป็นธุรกรรมเดียว
ต่างจากขั้นตอน/ฟังก์ชันที่เก็บไว้ทั่วไป ทริกเกอร์จะถูกเรียกโดยเซิร์ฟเวอร์โดยปริยายเมื่อมีเหตุการณ์ทริกเกอร์เฉพาะเกิดขึ้น นอกจากนี้ ทริกเกอร์ SQL ไม่มีอาร์กิวเมนต์ งานต่อไปนี้ได้รับการแก้ไขโดยใช้ทริกเกอร์:
- ตรวจสอบความถูกต้องของข้อมูลที่เปลี่ยนแปลงและตรวจสอบข้อจำกัดที่ซับซ้อน ความสมบูรณ์ของข้อมูลที่ต้องได้รับการสนับสนุน
- การสะสม ข้อมูลทางสถิติโดยการบันทึกข้อมูลเกี่ยวกับการเปลี่ยนแปลงที่เกิดขึ้น
- การสนับสนุนการจำลองแบบ
การใช้ข้อจำกัดด้านความสมบูรณ์ กำหนดกฎเกณฑ์และค่าต่างๆ ทำให้ไม่สามารถบรรลุระดับความสมบูรณ์ของข้อมูลที่ต้องการได้เสมอไป บางครั้งคุณจำเป็นต้องดำเนินการ อัลกอริธึมที่ซับซ้อนการตรวจสอบข้อมูลเพื่อให้มั่นใจถึงความน่าเชื่อถือและความเป็นจริง นอกจากนี้มักจำเป็นต้องติดตามการเปลี่ยนแปลงค่าตารางเพื่อให้สามารถแก้ไขข้อมูลที่เกี่ยวข้องได้ตามต้องการ ทริกเกอร์ SQLถือได้ว่าเป็นตัวกรองประเภทหนึ่งที่มีผลใช้บังคับหลังจากการดำเนินการทั้งหมดเสร็จสิ้นตามกฎแล้ว ค่ามาตรฐานฯลฯ
แอปพลิเคชัน ทริกเกอร์ SQLเกี่ยวข้องกับต้นทุนทรัพยากรเซิร์ฟเวอร์เพิ่มเติมสำหรับการเพิ่มการดำเนินการ ( ทริกเกอร์แทรก) การอัปเดต ( อัปเดตทริกเกอร์) หรือการลบ ( ทริกเกอร์ลบ) ข้อมูลในตาราง
เมื่อสามารถบรรลุผลลัพธ์เดียวกันได้โดยใช้ขั้นตอนการจัดเก็บหรือโปรแกรมแอปพลิเคชัน การใช้ทริกเกอร์จะไม่สามารถทำได้จริง
สร้างทริกเกอร์
รูปแบบพื้นฐานของคำสั่ง CREATE TRIGGER แสดงอยู่ด้านล่าง:สร้างทริกเกอร์ trigger_name [ ก่อน | หลังจาก ] เปิด table_name เริ่มต้น
ช่วงเวลาที่ทริกเกอร์เริ่มต้นจะถูกกำหนดโดยคำหลัก ก่อน(ทริกเกอร์เริ่มทำงานก่อนที่จะดำเนินการเหตุการณ์ที่เกี่ยวข้องกับทริกเกอร์ เช่น ก่อนที่จะเพิ่มบันทึก) หรือ หลังจาก(หลังเหตุการณ์) หากมีการเรียกทริกเกอร์ก่อนเหตุการณ์ ทริกเกอร์จะสามารถทำการเปลี่ยนแปลงบันทึกที่แก้ไขโดยเหตุการณ์ได้ เว้นแต่เหตุการณ์จะเป็นการลบบันทึก DBMS บางตัวกำหนดข้อจำกัดเกี่ยวกับคำสั่งที่สามารถใช้ในทริกเกอร์ได้ (เช่น อาจไม่ได้รับอนุญาตให้ทำการเปลี่ยนแปลงในตารางที่ทริกเกอร์ "เชื่อมโยง" เป็นต้น)
ทริกเกอร์สามารถเชื่อมต่อไม่ได้กับตาราง แต่เชื่อมต่อกับมุมมอง ดู- ในกรณีนี้มีการใช้กลไก "มุมมองที่อัปเดตได้" ด้วยความช่วยเหลือ เมื่อแนบทริกเกอร์กับข้อมูลพร็อพเพอร์ตี้ คำหลัก ก่อนและ หลังจากส่งผลกระทบเฉพาะลำดับของการเรียกทริกเกอร์ เนื่องจากเหตุการณ์จริง (การลบ การแทรก หรือการอัปเดต) จะไม่เกิดขึ้น
สามารถเรียกทริกเกอร์ได้สำหรับแต่ละบรรทัด ( สำหรับแต่ละแถว) ครอบคลุมตามเหตุการณ์ที่กำหนด หรือเพียงครั้งเดียวสำหรับแต่ละเหตุการณ์ ( สำหรับแต่ละแถลงการณ์).
การกำหนด<список_псевдонимов>หมายถึงส่วนประกอบต่างๆ เช่น แถวเก่าหรือใหม่ (OLD / NEW) หรือตารางเก่าหรือใหม่ (OLD TABLE / NEW TABLE) ค่าเก่าใช้ไม่ได้กับเหตุการณ์การแทรก และค่าใหม่ใช้ไม่ได้กับเหตุการณ์การลบ
ข้อได้เปรียบหลักของทริกเกอร์ก็คือ คุณสมบัติมาตรฐานจะถูกบันทึกไว้ในฐานข้อมูลและเปิดใช้งานทุกครั้งที่มีการอัพเดต ซึ่งช่วยให้แอปพลิเคชันต่างๆ ง่ายขึ้นอย่างมาก
ทริกเกอร์ที่เขียนไม่ถูกต้องอาจนำไปสู่ ปัญหาร้ายแรงเกี่ยวข้องกับลักษณะของการอุดตัน ทริกเกอร์มีความสามารถ เวลานานบล็อกทรัพยากร ดังนั้นควรให้ความสนใจเป็นพิเศษเพื่อลดความขัดแย้งในการเข้าถึง
ทริกเกอร์ MS SQL
ไวยากรณ์สำหรับการสร้างทริกเกอร์ใน MS SQL DBMS มีดังนี้:
สร้างทริกเกอร์ trigger_name ON (พร้อมการเข้ารหัส) [ [,] [,] ] [ พร้อมผนวก ] [ ไม่ใช่สำหรับการจำลอง ] AS ( sql_statement )
สคีมา_ชื่อ
ชื่อของวงจรทริกเกอร์ DML การกระทำ ทริกเกอร์ DMLจำกัดอยู่ที่ขอบเขตสคีมาของตารางหรือมุมมองที่ถูกสร้างขึ้น ไม่สามารถระบุ schema_name สำหรับทริกเกอร์ DDL หรือทริกเกอร์การเข้าสู่ระบบได้
trigger_name
ชื่อทริกเกอร์ อาร์กิวเมนต์ trigger_name ต้องเป็นไปตามกฎสำหรับตัวระบุ ยกเว้นว่า trigger_name ไม่สามารถขึ้นต้นด้วยอักขระ # หรือ ##
table_name | view_name
ตารางหรือมุมมองที่มีการแนบทริกเกอร์
ตัวอย่างทริกเกอร์ ms sql
หากต้องการใช้ทริกเกอร์ จะมีการสร้างตาราง 2 ตาราง ได้แก่ test_table, test_log ทริกเกอร์จะเชื่อมต่อกับตาราง test_table เมื่ออัปเดตบันทึกในตาราง test_table ทริกเกอร์จะบันทึกผลลัพธ์ของการเปลี่ยนแปลงในตาราง test_log เหล่านั้น. ทริกเกอร์จะถูกเรียกในเหตุการณ์การอัปเดต
ตารางทดสอบ test_table:
สร้างตาราง dbo.test_table (id int ไม่ใช่ null, field1 varchar(255) null, field2 varchar(255) null, ข้อ จำกัด pkTestTableID คีย์หลัก(รหัส));
ตารางการบันทึก Test_log:
สร้างตาราง dbo.test_log (id bigint identity(1,1) ไม่ใช่ null, table_name varchar(50) ไม่ใช่ null, oper varchar(15) ไม่ใช่ null, record_old xml null, record_new xml null, ข้อมูล datetime null, ข้อ จำกัด คีย์หลัก pkTestLogID ( รหัส));
ทริกเกอร์การอัปเดตข้อมูล:
การอัปเดตทริกเกอร์สร้างทริกเกอร์ dbo.trg_test_table_update บน dbo.test_table สำหรับ UPDATE เมื่อเริ่มต้นตั้งค่า nocount บน - ตัวแปรสำหรับการจัดเก็บข้อมูลเก่าและข้อมูลใหม่ประกาศ @record_new xml;
ประกาศ @record_old xml;
-- ตารางที่ถูกลบจะเก็บชุดข้อมูลเก่า/ที่ถูกลบ @record_old = (SELECT * FROM ถูกลบสำหรับ XML RAW, TYPE);
-- ตารางที่แทรกจะเก็บชุดข้อมูลที่เปลี่ยนแปลง (เพิ่งสร้าง) @record_new = (SELECT * FROM แทรกสำหรับ XML RAW, TYPE);
ถ้า (@record_new ไม่ใช่ null) และ (@record_old ไม่ใช่ null) ให้เริ่มต้นการแทรกลงใน dbo.test_log (table_name, oper, record_old, record_new, data) ค่า ("test_table", "update", @record_old, @record_new , GETDATE ()) สิ้นสุด; จบ;
มาเพิ่มแถวสองสามแถวลงในตารางทดสอบ ซึ่งเราจะอัปเดตเพื่อทดสอบทริกเกอร์:
แทรกลงในค่า dbo.test_table (id, field1, field2) (1, "กาแฟ", "เนสกาแฟ"); แทรกลงในค่า dbo.test_table (id, field1, field2) (2, "Tea" , "Greenfield");
เราตรวจสอบการทำงานของทริกเกอร์โดยอัปเดตแถว:
ตรวจสอบตารางการบันทึก test_log ผลลัพธ์ควรมีลักษณะเหมือนที่แสดงในภาพหน้าจอ:
ข้อมูล XML ได้รับการตรวจสอบและแสดงให้เห็นว่าตารางการบันทึกมีทั้งค่าเก่าและใหม่
ทริกเกอร์ PostgreSQL
ไวยากรณ์สำหรับการสร้างทริกเกอร์ สร้างทริกเกอร์ trigger_name [ เหตุการณ์ [ หรือ เหตุการณ์ ]] บน table_name สำหรับแต่ละ ( ROW | STATEMENT ) ดำเนินการขั้นตอน function_name (อาร์กิวเมนต์)อาร์กิวเมนต์ระบุชื่อของทริกเกอร์ที่จะสร้าง หากจำเป็นสามารถระบุชื่อของโครงการได้ (ก่อน | หลัง)คีย์เวิร์ด BEFORE หมายความว่าเช่นนั้น
ทริกเกอร์ก่อน
และจะต้องดำเนินการฟังก์ชันก่อนที่จะดำเนินการเหตุการณ์ที่เกี่ยวข้อง คีย์เวิร์ด AFTER หมายความว่าเช่นนั้น ทริกเกอร์หลังจากนั้นและฟังก์ชันนี้จะถูกเรียกหลังจากการดำเนินการที่ทริกเกอร์เสร็จสิ้น
( กิจกรรม [ หรือ กิจกรรม... ] )
สำหรับแต่ละ ( แถว | คำชี้แจง )
คำหลักที่ตามหลังโครงสร้าง สำหรับแต่ละและกำหนดจำนวนการเรียกใช้ฟังก์ชันเมื่อมีเหตุการณ์ที่ระบุเกิดขึ้น การใช้ ROW หมายความว่ามีการเรียกใช้ฟังก์ชันสำหรับแต่ละระเบียนที่มีการแก้ไข หากต้องเรียกใช้ฟังก์ชันเพียงครั้งเดียวสำหรับทั้งคำสั่ง คำสำคัญ STATEMENT จะถูกนำมาใช้
ดำเนินการขั้นตอน function_name
ชื่อของฟังก์ชันที่เรียกว่าพร้อมอาร์กิวเมนต์ ในทางปฏิบัติ อาร์กิวเมนต์จะไม่ถูกใช้เมื่อเรียกใช้ฟังก์ชันทริกเกอร์
ไวยากรณ์คำจำกัดความฟังก์ชันทริกเกอร์
สร้างฟังก์ชัน function_name () ส่งคืนทริกเกอร์ AS DECLARE -- การประกาศตัวแปร BEGIN -- ฟังก์ชันทริกเกอร์ END; ภาษา plpgsql;
ฟังก์ชันทริกเกอร์ใช้ตัวแปรพิเศษที่มีข้อมูลเกี่ยวกับทริกเกอร์ที่เริ่มทำงาน การใช้ตัวแปรเหล่านี้ ฟังก์ชั่นทริกเกอร์ทำงานร่วมกับข้อมูล รายการด้านล่างคือตัวแปรบางส่วนที่มีอยู่ในฟังก์ชันทริกเกอร์
ชื่อ | พิมพ์ | คำอธิบาย |
---|---|---|
ใหม่ | บันทึก | ค่าฟิลด์ใหม่ของบันทึกที่สร้างโดยคำสั่ง INSERT หรือคำสั่ง UPDATE ที่อัปเดตเมื่อทริกเกอร์ระดับบันทึก (ROW) เริ่มทำงาน ตัวแปรใช้เพื่อแก้ไขบันทึกใหม่ ตัวแปร NEW ใช้ได้เฉพาะระหว่าง INSERT และ UPDATE เท่านั้น ฟิลด์ของระเบียนใหม่สามารถเปลี่ยนแปลงได้โดยทริกเกอร์ |
เก่า | บันทึก | ค่าฟิลด์บันทึกเก่าที่มีอยู่ในบันทึกก่อนที่คำสั่ง DELETE หรือ UPDATE จะถูกดำเนินการเมื่อทริกเกอร์ระดับบันทึก (ROW) เริ่มทำงาน ตัวแปร OLD ใช้ได้เฉพาะกับ DELETE และ UPDATE เท่านั้น ฟิลด์บันทึกเก่าเป็นแบบอ่านอย่างเดียวและไม่สามารถแก้ไขได้ |
ทีจี_NAME | ชื่อ | ชื่อของทริกเกอร์ที่ยิง |
TG_WHEN | ข้อความ | คำสั่ง BEFORE หรือ AFTER ขึ้นอยู่กับว่าทริกเกอร์ที่ระบุในคำจำกัดความเริ่มทำงานเมื่อใด |
TG_LEVEL | ข้อความ | สตริง ROW หรือ STATEMENT ขึ้นอยู่กับระดับทริกเกอร์ที่ระบุในคำจำกัดความ |
TG_OP | ข้อความ | สตริง INSERT, UPDATE หรือ DELETE ขึ้นอยู่กับการดำเนินการที่ทำให้ทริกเกอร์เริ่มทำงาน |
TG_RELID | ออยด์ | ตัวระบุวัตถุของตารางที่ทริกเกอร์เริ่มทำงาน |
TG_RELNAME | ชื่อ | ชื่อของตารางที่ทริกเกอร์เริ่มทำงาน |
ไปยังแต่ละฟิลด์ของเรกคอร์ด ใหม่และ เก่าในขั้นตอนทริกเกอร์จะมีการจัดการดังนี้ NEW.names, OLD.rg
ตัวอย่างทริกเกอร์ PostgreSQL
นำไปใช้ในตัวอย่าง ระบบที่เรียบง่ายการบันทึกผู้ใช้ จะตรวจสอบตารางผู้ใช้และบันทึกการเปลี่ยนแปลงทั้งหมดในตารางการบันทึก ตัวอย่างเช่น เราจะสร้างตารางแบบง่าย
ตารางผู้ใช้:
สร้างตาราง "public".users (id int ไม่ใช่ null ชื่อ varchar (64) ข้อ จำกัด คีย์หลัก pkUsersID (id));
ตารางการบันทึก
สร้างตาราง "public".logs (varchar ข้อความ (256) การประทับเวลาข้อมูลโดยไม่มีเขตเวลา)
ฟังก์ชั่นทริกเกอร์
สร้างหรือแทนที่ฟังก์ชัน "public".add_to_log() ส่งคืนทริกเกอร์เป็น $$ ประกาศ v_action varchar(30);
v_user วาร์ชาร์(64); สิ่งกระตุ้น v_retstr วาร์ชาร์(256); เริ่มต้น ถ้า TG_OP = "INSERT" จากนั้น v_user = NEW.name; v_action:= "เพิ่มผู้ใช้ใหม่"; v_retstr:= v_action || v_ผู้ใช้; TG_OP INSERT INTO "public".logs(ข้อความ, ข้อมูล) ค่า (v_retstr, NOW());
กลับมาใหม่; ใหม่และ เก่า ELSIF TG_OP = "อัปเดต" จากนั้น v_user = NEW.name; v_action:= "อัปเดตผู้ใช้"; v_retstr:= v_action || v_ผู้ใช้;
INSERT INTO "public".logs(ข้อความ, ข้อมูล) ค่า (v_retstr, NOW());
กลับมาใหม่;
ELSIF TG_OP = "ลบ" จากนั้น v_user = OLD.name;
v_action:= "ลบผู้ใช้";
v_retstr:= v_action || v_ผู้ใช้;
INSERT INTO "public".logs(ข้อความ, ข้อมูล) ค่า (v_retstr, NOW());
คืนความเก่า;
เอนดิฟ; จบ; $$ ภาษา plpgsql;<список_псевдонимов>สำหรับแต่ละแถวเมื่อ (new.field_name > 0) ประกาศ -- ตัวแปร ค่าคงที่ เคอร์เซอร์ ฯลฯ เริ่มต้น -- สิ้นสุดบล็อก PL/SQL;
ข้อจำกัดทริกเกอร์ที่เป็นทางเลือกสามารถรวมไว้ในข้อความการสร้างทริกเกอร์โดยการกำหนดนิพจน์บูลีน SQL ในวลี เมื่อไร- นิพจน์ในส่วนคำสั่ง WHEN ได้รับการทดสอบสำหรับแต่ละแถวที่ได้รับผลกระทบจากทริกเกอร์ หากผลลัพธ์ของนิพจน์เป็น TRUE เนื้อหาของทริกเกอร์จะถูกดำเนินการ หากนิพจน์เป็น FALSE หรือ NULL เนื้อหาทริกเกอร์จะไม่ถูกดำเนินการ นิพจน์ในส่วนคำสั่ง WHEN ต้องเป็นนิพจน์ SQL ไม่ใช่นิพจน์ PL/SQL และไม่สามารถรวมแบบสอบถามย่อยได้
อ้างอิง
ตัวเลือกการอ้างอิงสามารถใช้ในส่วนเนื้อหาของทริกเกอร์เพื่อหลีกเลี่ยงความขัดแย้งระหว่างชื่อความสัมพันธ์และชื่อตารางในกรณีที่ตารางชื่อ "เก่า" หรือ "ใหม่" สถานการณ์นี้เกิดขึ้นไม่บ่อยนักและแทบไม่เคยใช้ตัวเลือกนี้เลย
เป็นตัวอย่าง พิจารณาตารางชื่อใหม่ คำจำกัดความถัดไป สร้างทริกเกอร์แสดงทริกเกอร์ที่เกี่ยวข้องกับตาราง ใหม่ซึ่งใช้ตัวเลือก อ้างอิงเพื่อหลีกเลี่ยงความขัดแย้งระหว่างชื่อความสัมพันธ์และชื่อตาราง:
ทริกเกอร์ก่อน CREATE TRIGGER trg_dummy ก่อนอัปเดตในการอ้างอิงใหม่ ใหม่เป็นใหม่ล่าสุดสำหรับแต่ละแถว BEGIN:newest.field2:= TO_CHAR (:newest.field1); จบ;
ผู้ดำเนินการ ใหม่เปลี่ยนชื่อเป็นตัวเลือกการใช้ใหม่ล่าสุด อ้างอิงแล้วนำไปใช้ในตัวไกปืน
ภาคแสดงแบบมีเงื่อนไข
หากทริกเกอร์สามารถดำเนินการได้ด้วยคำสั่ง DML มากกว่าหนึ่งประเภท (เช่น "INSERT OR DELETE OR UPDATE") คำสั่งนั้นก็สามารถนำมาใช้ในเนื้อความของทริกเกอร์ได้ การใส่, กำลังลบและ กำลังอัปเดตเพื่อรันโค้ดส่วนต่างๆ ขึ้นอยู่กับเงื่อนไข ในโค้ดภายในเนื้อหาทริกเกอร์ คุณสามารถใช้เงื่อนไขต่อไปนี้:
หากใส่แล้ว - - เอนดิฟ; หากอัปเดตแล้ว - - เอนดิฟ;
จะตรงตามเงื่อนไขแรกในกรณีที่ทริกเกอร์เริ่มทำงานเมื่อมีการแทรกแถวลงในตาราง เงื่อนไขที่สองจะเป็นไปตามเมื่อมีการอัปเดตแถวของตาราง
ในตัวดำเนินการ กำลังอัปเดตคุณสามารถใช้เงื่อนไขเพิ่มเติมเพื่อตรวจสอบชื่อของคอลัมน์ที่กำลังอัปเดตได้ ตามตัวอย่าง ให้พิจารณาโค้ดต่อไปนี้ โดยที่เนื้อหาจะถูกดำเนินการหากส่วนคำสั่ง UPDATE ที่ทำให้เกิดทริกเกอร์อัปเดตคอลัมน์ SAL:
หากอัปเดต ("SAL") แล้ว - - เอนดิฟ;
ออราเคิล ทำให้เกิดการปิดเครื่องการรวม
ใน Oracle ทริกเกอร์สามารถปิดใช้งานได้ชั่วคราวหากเกิดเงื่อนไขข้อใดข้อหนึ่งต่อไปนี้:
- ไม่สามารถเข้าถึงวัตถุที่อ้างอิงโดยทริกเกอร์
- จำเป็นต้องโหลดข้อมูลจำนวนมากโดยไม่ต้องเรียกทริกเกอร์
- คุณต้องโหลดข้อมูลลงในตารางโดยไม่ต้องเรียกใช้ทริกเกอร์
ทริกเกอร์จะเปิดใช้งานตามค่าเริ่มต้นเมื่อถูกสร้างขึ้น หากต้องการปิดใช้งานทริกเกอร์ คุณต้องใช้คำสั่ง เปลี่ยนทริกเกอร์พร้อมตัวเลือก ปิดการใช้งาน- หากต้องการเปิดใช้งานทริกเกอร์ ให้ใช้คำสั่ง ALTER TRIGGER พร้อมตัวเลือก เปิดใช้งาน- คุณสามารถปิดการใช้งานทริกเกอร์ทั้งหมดที่เกี่ยวข้องกับตารางพร้อมกันได้โดยใช้คำสั่ง แก้ไขตารางพร้อมตัวเลือก ปิดการใช้งานทริกเกอร์ทั้งหมด.
ปิดการใช้งานทริกเกอร์ ALTER TRIGGER TRG_Orders_INS DISABLE; -- เชื่อมต่อทริกเกอร์ ALTER TRIGGER TRG_Orders_INS ENABLE; -- ปิดการใช้งานทริกเกอร์ตารางทั้งหมด แก้ไขคำสั่งตาราง ปิดการใช้งานทริกเกอร์ทั้งหมด;
หากต้องการเปิดใช้งานหรือปิดใช้งานทริกเกอร์โดยใช้คำสั่ง ALTER TABLE คุณต้องเป็นเจ้าของตารางหรือมีสิทธิ์ที่เหมาะสม
ตัวอย่างทริกเกอร์ของ Oracle
เครื่องกำเนิดลำดับ สร้างลำดับ seqID; -- ตารางผู้ใช้ สร้างผู้ใช้ตาราง (id int PRIMARY KEY ไม่ใช่ null ชื่อ varchar (50) โทรศัพท์ varchar (15) วันที่ dt); -- ทริกเกอร์แทรกระบุรหัสบันทึกที่สร้างหรือแทนที่ทริกเกอร์ trgAutonumber ก่อนที่จะแทรกผู้ใช้ -- ทริกเกอร์ก่อนสำหรับแต่ละแถวเริ่มต้นเลือก seqID.NEXTVAL เป็น: new.id จากคู่; จบ; -- ทริกเกอร์แทรกระบุวันที่บันทึก สร้างหรือแทนที่ทริกเกอร์ trgDate ก่อนที่จะแทรกบน ผู้ใช้ทริกเกอร์ก่อน สำหรับแต่ละแถวเริ่มต้น ถ้า: old.dt เป็นโมฆะ แล้ว: new.dt:= current_date;
สิ้นสุดถ้า; สิ้นสุด trgDate; ในตัวอย่างต่อไปนี้ ทริกเกอร์ trgDepartmentst_del_cascade ดำเนินการลบเรกคอร์ดแบบเรียงซ้อนทริกเกอร์ลบ CASCADE
- ทริกเกอร์ที่เชื่อมต่อกับตารางแผนกจะใช้การดำเนินการอ้างอิง DELETE CASCADE บนคีย์หลักของตาราง deptID:
ทริกเกอร์หลังจากสร้างหรือแทนที่ทริกเกอร์ trgDepartmentst_del_cascade หลังจากลบบนแผนกสำหรับแต่ละแถว BEGIN /* หลังจากลบแถวออกจากตาราง Departments แล้ว ให้ลบแถวทั้งหมดออกจากตาราง Employees ที่มีค่า deptID เหมือนกัน */ ลบออกจากพนักงาน โดยที่ Employee.deptID = :old.deptID; จบ; หมายเหตุ: โดยปกติจะเป็นรหัสสำหรับลบน้ำตก
หา
คำถาม: ฉันต้องการทริกเกอร์ที่จะอัปเดตตารางหนึ่งเมื่อมีการเพิ่มบันทึกไปยังอีกตารางหนึ่ง
เราต้องการทริกเกอร์ที่จะเริ่มทำงานหลังจากเพิ่มบันทึกลงในตารางแล้ว
ดังนั้นจึงมี:
ตารางผลิตภัณฑ์
ผู้ผลิตโต๊ะ
จำเป็นที่เมื่อเพิ่มบันทึกลงในตารางผลิตภัณฑ์ ทริกเกอร์จะค้นหาผู้ผลิตที่อยู่ในผลิตภัณฑ์นี้และในตารางผู้ผลิตจะเพิ่ม +1 ลงในคอลัมน์ kol_tov
ฉันไม่เข้าใจเลยว่าจะจัดระเบียบทั้งหมดนี้อย่างไร (
คำตอบ:เมื่อเพิ่ม (!) บันทึกลงในตาราง "ผลิตภัณฑ์" ทริกเกอร์ดังกล่าวจะเพิ่ม +1 ให้กับตาราง "ผู้ผลิต":
รหัส T-SQL | |
แน่นอนว่าสิ่งนี้ไม่ได้คำนึงว่ารายการนั้นสามารถแก้ไขหรือลบได้
ป.ล.
ในที่นี้ฉันหมายถึงการมีฟิลด์ "ManufacturerID" ในทั้งสองตาราง
เพิ่มหลังจากผ่านไป 10 นาที
ฉันมีความคลาดเคลื่อน... ทริกเกอร์ใหม่ไม่ใช่ "ALTER TRIGGER..." แต่เป็น "CREATE TRIGGER..." ฉันขอโทษ
คำถาม: ฉันจะเพิ่มบันทึกลงในสองตารางพร้อมกันในทริกเกอร์ได้อย่างไร
สวัสดี!! จะใช้ทริกเกอร์เพื่อเพิ่มบันทึกลงในสองตารางพร้อมกันได้อย่างไร
มีตาราง Students และ TableForTriggers โครงสร้างของตาราง TableForTriggers นั้นเหมือนกับตาราง Students ข้อแตกต่างเพียงอย่างเดียวคือมีอีกหนึ่งคอลัมน์ที่แสดงค่าของการดำเนินการสำหรับบันทึก - แทรกอัปเดต , ลบ.
นี่คือทริกเกอร์ของฉันในการเพิ่มบันทึกลงในตารางเดียวเท่านั้น:
และทริกเกอร์ยังไม่ถูกบันทึก ฉันควรทำอย่างไร?
เพิ่มหลังจาก 40 นาที
การบันทึกทริกเกอร์ช่วยแก้ปัญหาทุกอย่างได้
คำตอบ:
ข้อความจาก แบ็คโบลอต
โครงสร้างของตาราง TableForTriggers นั้นเหมือนกับตารางนักเรียน ข้อแตกต่างเพียงอย่างเดียวคือมีอีกหนึ่งคอลัมน์ที่แสดงค่าของการดำเนินการสำหรับบันทึก - แทรก อัปเดต ลบ
ไม่ว่างานจะงี่เง่าหรือคุณไม่เข้าใจเงื่อนไขอย่างถ่องแท้ ตารางนั้นจำเป็นต้องมีช่องเพิ่มค่าอัตโนมัติของตัวเอง และ Id ซึ่งใน Students ควรเป็นแอตทริบิวต์ปกติ ไม่เช่นนั้นหลังจากอัปเดตใน Students แล้ว อัปเดตใหม่เมื่อส่งคืนชื่อก่อนหน้า คุณจะได้รับรายการที่เหมือนกันทั้งหมดใน TableForTriggers และนี่เป็นสิ่งที่ผิดมาก นอกจากนี้ ลำดับการอัปเดตบันทึกเดียวกันในนักเรียนจะไม่สามารถเข้าใจได้อย่างสมบูรณ์ และความหมายใด ๆ จากตาราง TableForTriggers จะหายไปโดยสิ้นเชิง
คำถาม: การสร้างแบบฟอร์มสำหรับการเพิ่มหลายระเบียนลงในตาราง
สวัสดีตอนบ่ายเรียนผู้ใช้ฟอรั่ม
บางทีคำถามอาจดูเหมือนคำถามอื่น ๆ และซ้ำซากสำหรับใครบางคน แต่ฉันไม่รู้ว่าจะเข้าหาจากฝ่ายไหน
เข้าถึงได้ไม่เก่ง
คำอธิบายทั่วไป: ฐานข้อมูลระยะเริ่มต้นประกอบด้วย 3 ตาราง:
1. ยานพาหนะ - มีช่องข้อมูลเกี่ยวกับรถยนต์
2. อุปกรณ์ออนบอร์ด - มีช่องข้อมูลพร้อมข้อมูลเกี่ยวกับอุปกรณ์ออนบอร์ด
3.เวลาทำการของการขนส่ง
ตาราง "เวลาทำการ" ประกอบด้วยฟิลด์ต่อไปนี้: ปี, เดือน, หมายเลขยานพาหนะของรัฐ, ระยะทาง, ปริมาณการใช้ ฯลฯ
คุณสามารถกรอกตารางนี้ในเวอร์ชันที่ง่ายที่สุด ได้ทั้งด้วยตนเองในตารางโดยตรงหรือโดยการสร้าง รูปแบบที่เรียบง่ายตามตารางนี้และกรอกทีละรายการ
ฉันค้นหาในฟอรัมและไม่พบทิศทางที่จะขุดด้วยซ้ำ
คำถามคือ เป็นไปได้ไหมที่จะสร้างแบบฟอร์มสำหรับเพิ่มหลายระเบียน
เหล่านั้น. ผู้ใช้เมื่อเปิดแบบฟอร์มแล้วจะเห็นช่องด้านบน: "ปี" และ "เดือน" โดยค่าเริ่มต้นจะมีการกำหนดค่าของปีและเดือนของวันที่ปัจจุบันตามลำดับ
ใต้ฟิลด์เหล่านี้ควรมีตารางพร้อมรายการยานพาหนะ (จากตาราง "ยานพาหนะ") และสำหรับแต่ละรายการเหล่านี้ ยานพาหนะตารางนี้ควรมีช่องเกี่ยวกับระยะทาง ปริมาณการใช้ ฯลฯ เช่น ช่องว่างที่มีข้อมูลเกี่ยวกับเวลาทำการ ซึ่งพร้อมที่จะกรอก
ผู้ใช้ตั้งค่าเดือนที่ต้องการ กรอกข้อมูลเวลาทำการของยานพาหนะแต่ละคัน และหลังจากกรอกข้อมูลนี้แล้ว ควรสร้างบันทึกที่เกี่ยวข้องในตาราง "ชั่วโมงทำงาน" ซึ่งจะนำปีและเดือนมาจากช่องแยกด้านบนสุด (พร้อมรายการแบบเลื่อนลง) และข้อมูลเวลาทำการจากตารางตามลำดับสำหรับแต่ละเครื่อง
ใน ในขณะนี้ปัญหาของการจัดระเบียบการตรวจสอบการมีอยู่ของบันทึกในฐานข้อมูลสำหรับช่วงเวลาที่เลือกไม่ได้รับการพิจารณา - มันถูกเพิ่มหรือซ้อนทับในอันเก่าอย่างเงียบ ๆ
ปล. คุณไม่จำเป็นต้องทำเพื่อฉัน แค่ชี้ให้ฉันไปในทิศทางที่ถูกต้อง
คำตอบ:
ข้อความจาก xopek160183
เป็นไปได้ไหมที่จะตั้งค่าเงื่อนไขการเลือกเดียวกันเพื่อให้ดำเนินการแบบสอบถามทั้งสองเมื่อป้อนค่าการเลือกครั้งเดียว?
ใช่ ใช้กล่องคำสั่งผสมในแบบฟอร์มการเลือก และอ้างอิงถึงฟิลด์นี้ในคำขอ
ตัวอย่างเช่น:
รหัส T-SQL | ||
|
คำถาม: การเพิ่มบันทึกลงในตารางตาม บันทึกที่มีอยู่
สวัสดี!
ฉันเพิ่งเริ่มเรียนรู้ PHP และ MySQL และแน่นอนว่าไม่ใช่ทุกอย่างจะได้ผล
ฉันมีตารางที่มีผู้ใช้ USERS โดยในนั้นคือ 1) ID (pc, ai), 2) ฟิลด์อื่น ๆ 3) ฟิลด์ PAGE ซึ่งเขียนเส้นทางไปยังหน้าของผู้ใช้
ฉันต้องการว่าเมื่อเพิ่มบันทึกลงในตาราง ฉันจะกรอกข้อมูลในทุกฟิลด์ยกเว้น ID และ PAGE และค่าของฟิลด์ PAGE จะถูกสร้างขึ้นตามฟิลด์ ID นั่นคือ เช่น ID=1, ..., PAGE=/userpage.php?id=1
ฉันเข้าใจว่าสำหรับสิ่งนี้ ฉันจำเป็นต้องสร้างทริกเกอร์ แต่มันทำให้ฉันมีข้อผิดพลาด (ไม่สามารถอัปเดตตาราง "ผู้ใช้" ในฟังก์ชัน/ทริกเกอร์ที่เก็บไว้ได้ เนื่องจากมีการใช้คำสั่งนี้แล้วซึ่งเรียกใช้ฟังก์ชัน/ทริกเกอร์ที่เก็บไว้นี้) เมื่อเพิ่ม เส้นและแน่นอนว่าใช้งานไม่ได้
เพราะทุกอย่างอื่นถูกตั้งค่าโดย php admin ของฉัน
ขอขอบคุณผู้ที่จะช่วยแก้ไขข้อผิดพลาด
เวอร์ชัน - PHP 5.5, MySQL 5.5
คำตอบ:ฉันสงสัยว่าเหตุใดจึงไม่กรอกฟิลด์ ID เมื่อฟิลด์ PAGE ถูกสร้างขึ้นบนพื้นฐานของมัน ซึ่งหมายความว่าจำเป็นต้องสร้างค่า ID และเก็บไว้ที่ใดที่หนึ่ง
คำถาม: การเรียกใช้แบบสอบถามเพื่อเพิ่มระเบียน
สมาชิกฟอรัม ขอให้เป็นวันที่ดี!
โปรดบอกฉันว่าฉันสามารถเรียกใช้แบบสอบถามเพื่อเพิ่มระเบียนลงในตารางได้อย่างไร
ด้วยรหัสนี้:
รหัส SQL | ||
|
สาบานสองครั้ง:
1.กลไกจัดการฐานข้อมูลไม่พบตารางอินพุตหรือแบบสอบถาม
2.ไม่สามารถเพิ่มรายการทั้งหมดได้...
หากคุณไม่สามารถเพิ่มบันทึกทั้งหมดได้ ปล่อยมันไป! ไม่จำเป็นต้องแสดงข้อความแสดงข้อมูล (ไม่สามารถเพิ่มบันทึกทั้งหมดได้...)
ด้วยรหัสนี้:
รหัส SQL | ||
|
สาบาน 1 ครั้ง (เพิ่มบันทึกทั้งหมดไม่ได้...)
บอกฉันว่าฉันจะเรียกใช้คำขอได้อย่างไร
คำตอบ: มือถือ, ขอบคุณ!
ให้ฉันอธิบายรายละเอียดเพิ่มเติม: เริ่มแรกข้อมูลเกี่ยวกับแต่ละหน่วยบรรจุภัณฑ์ของส่วนประกอบจะถูกป้อนลงในตารางที่ 1 (และบาร์โค้ดแต่ละอันจะติดอยู่)
จากนั้นแต่ละแพ็คเกจจะถูกวางไว้ใน "ใบเสร็จรับเงิน" - นั่นคือคัดลอกลงในตารางที่ 2 (โดยใช้แบบสอบถามที่อธิบายไว้ข้างต้น) สร้างฟิลด์เฉพาะในตารางนี้ (table_code1)
เหล่านั้น. บันทึกที่ถูกคัดลอกไปยัง table2 แล้ว จะไม่สามารถคัดลอกจาก table1 ได้อีกต่อไปในระหว่างการคัดลอกครั้งต่อไป
วิธีแก้ปัญหาไม่ดี จะดีกว่าถ้าคัดลอกระเบียนที่ป้อนใหม่ (ในตารางที่ 1) ที่อยู่ใน Form1
มีบางอย่างไม่ได้ผลทันที - จำเป็นต้องสร้างโมดูลทำให้ฟังก์ชันของโมดูลนี้เป็นเงื่อนไขการเลือกในคำขอ... (นั่นคือสิ่งที่แนะนำฉันและสร้างขั้นตอนที่เกี่ยวข้องแล้ว รวมถึงคุณด้วย) ตอนนี้ใช้งานไม่ได้ ฉันจะลองอีกครั้งในภายหลัง
คำถาม: เป็นไปได้ไหมที่จะสร้างทริกเกอร์สำหรับการจำลองธุรกรรม
กำหนดค่าการจำลองแบบทรานแซคชันแล้ว
ฉันตรวจสอบแล้ว: ทริกเกอร์ FOR INSERT สำหรับตารางสมาชิกไม่ทำงานเมื่อเพิ่มบันทึกผ่านการจำลองแบบนี้
คำถาม: เป็นไปได้ไหมที่จะติดตามการแทรกบันทึกใหม่ลงในตารางของผู้สมัครสมาชิกผ่านการจำลองแบบทรานแซคชัน
บางอย่างเช่น:
สร้างทริกเกอร์สำหรับการแทรกสำหรับการจำลองแบบ
- ทำอย่างไร?
คำตอบ:และมันเป็นเรื่องจริง - ฉันลบทริกเกอร์ของผู้จัดพิมพ์ออกแล้วและทุกอย่างทำงานได้ตามปกติสำหรับผู้สมัครสมาชิก - ขอบคุณ!
มีสิ่งหนึ่งที่ฉันยังคงไม่เข้าใจ:
เหตุใดเมื่อมีทริกเกอร์สองตัว ค่า N ที่เพิ่มให้กับผู้จัดพิมพ์จึงเพิ่มขึ้น
เมื่อมาถึงสมาชิกในวันที่ 1 และไม่ใช่วันที่ 2
คำถาม: ทริกเกอร์ให้เปลี่ยนค่าของฟิลด์เมื่อเพิ่มระเบียนไปยังอีกระเบียนหนึ่ง ตารางมายเอสคิวแอล
ฉันทำงานใน phpMyAdmin
พวกคุณนี่เป็นปัญหา ฉันไม่เข้าใจว่าเกิดอะไรขึ้นเพราะ... ฉันเป็นมือใหม่ MySQL
โดยพื้นฐานแล้ว ฉันจำเป็นต้องเปลี่ยนค่าในคอลัมน์ "จำนวนหนังสือ" ในตาราง "หนังสือ" เมื่อมีการเพิ่ม "การขาย" ลงในตาราง รายการใหม่เรื่องการขาย-ทำทุกอย่างด้วย TRIGGER
สร้างตารางหากไม่มี `หนังสือ' (
`ผู้เขียน` varchar (100) ไม่เป็นโมฆะ
`ชื่อ` varchar (100) ไม่เป็นโมฆะ
วันที่ 'ปีที่พิมพ์' ไม่เป็นโมฆะ
`ID` int (11) ไม่เป็นโมฆะ AUTO_INCREMENT
`ผู้จัดพิมพ์` varchar (100) ไม่เป็นโมฆะ
`จำนวนหนังสือ` int(11) ไม่เป็นโมฆะ
`ราคา` int(11) ไม่เป็นโมฆะ
คีย์หลัก (`ID`)
) ENGINE=อักขระเริ่มต้นของ InnoDB=utf8 AUTO_INCREMENT=4 ;
INSERT INTO `books` (`ผู้แต่ง`, `ชื่อเรื่อง`, `ปีที่พิมพ์`, `ID`, `ผู้จัดพิมพ์`, `จำนวนหนังสือ`, `ราคา`) VALUES("Feoktistov Leonid", "Big Encyclopedia of Astronomy) "," 2009-01-01", 2, "Rosman-Press", 10, 310);
INSERT INTO `books` (`ผู้แต่ง`, `ชื่อเรื่อง`, `ปีที่พิมพ์`, `ID`, `ผู้จัดพิมพ์`, `จำนวนหนังสือ`, `ราคา`) VALUES("Iar Elterrus", "เสียงสะท้อนของเงิน ลม เรา - จะ ", "2009-01-01", 3, "อัลฟ่า - หนังสือ", 10, 735);
INSERT INTO `books` (`ผู้แต่ง`, `ชื่อเรื่อง`, `ปีที่พิมพ์`, `ID`, `ผู้จัดพิมพ์`, `จำนวนหนังสือ`, `ราคา`) VALUES("Lev Nikolaevich Tolstoy", "สงครามและสันติภาพ ", "1996-01-01", 4, "คำศัพท์", 10, 1300);
INSERT INTO `books` (`ผู้แต่ง`, `ชื่อเรื่อง`, `ปีที่พิมพ์`, `ID`, `ผู้จัดพิมพ์`, `จำนวนหนังสือ`, `ราคา`) VALUES("Mikhail Afanasyevich Bulgakov", "The Master and มาร์การิต้า", "2009-01-01", 5, "AST", 10, 185);
สร้างตารางหากไม่มี `การขาย` (
`BookID` int(11) ไม่เป็นโมฆะ
`หมายเลขสมุดบัญชีผู้ขาย` int (11) ไม่เป็นโมฆะ
วันที่ 'วันที่ขาย' ไม่เป็นโมฆะ
`หมายเลขการค้า` int(11) ไม่เป็นโมฆะ AUTO_INCREMENT,
`ผลรวม' int(11) ไม่เป็นโมฆะ
คีย์หลัก (`หมายเลขธุรกรรม`)
คีย์ `BookID` (`BookID`)
คีย์ `จำนวนผู้ขายในสมุดงาน` (`จำนวนผู้ขายในสมุดงาน`)
) ENGINE=อักขระเริ่มต้นของ InnoDB=utf8 AUTO_INCREMENT=1 ;
INSERT INTO `sale` (`BooksID`, `SellersWork book number`, `sale date`, `Transaction number`) ค่า(3, 70113047, "2016-01-01", "");
ตัวคั่น |
สำหรับแต่ละแถว
เริ่ม
อัปเดต `manual1`.`หนังสือ`
โดยที่ `books`.`ID` = `sale`.`BooksID`;
จบ;
หากฉันทำในลักษณะที่เมื่อเพิ่มบันทึกลงในตาราง `ยอดขาย` ฉันจะเขียนข้อผิดพลาด #1054 - คอลัมน์ที่ไม่รู้จัก "sale.BooksID" ใน "where clause""
-----
ตัวคั่น |
สร้างทริกเกอร์ `update_knigi` หลังจากใส่ใน `manual1`.`sale`
สำหรับแต่ละแถว
เริ่ม
อัปเดต `manual1`.`หนังสือ`
SET `จำนวนหนังสือ` = (`จำนวนหนังสือ` - 1)
WHERE `หนังสือ`.`ID`;
จบ;
หากเป็นเช่นนั้น ค่าต่างๆ จะถูกลบออกจากค่า "จำนวนหนังสือ" ทั้งหมด
ฉันไม่รู้จะทำยังไง โปรดช่วย:s
คำตอบ:ทำไมเยอะจัง ข้อมูลที่ไม่จำเป็น- มีการตั้งคำถามไว้อย่างชัดเจน
ในทริกเกอร์ befor_insert ของตารางการขาย ให้ดำเนินการค้นหา:
อัปเดต book_table SET number_of_books = number_of_books - NEW.number_of_books_sold WHERE table_book.book_code = NEW.book_code
คำถาม: การอัปเดตกล่องคำสั่งผสมหลังจากเพิ่มรายการลงในตาราง
สวัสดี!
บอกวิธีตรวจสอบให้แน่ใจว่าหลังจากเพิ่มระเบียนลงในตารางแล้ว ข้อมูลในกล่องคำสั่งผสมจะได้รับการอัปเดต ฉันเพิ่มรายการแต่มันไม่ปรากฏในกล่องคำสั่งผสม หรือหากฉันเพิ่มเป็นครั้งแรก รายการแรกจะปรากฏในกล่องคำสั่งผสมด้วยเหตุผลบางอย่าง และหากฉันเพิ่มเป็นครั้งที่สอง รายการที่สองจะไม่ปรากฏขึ้น และทุกครั้งหลังปิดฐานแล้วเปิดใหม่อีกครั้ง
คำตอบ:ฉันไม่มีส่วนเกี่ยวข้องกับมาโคร ดังนั้นฉันจึงช่วยคุณไม่ได้ แต่ใน VBA จะเป็นเช่นนี้ - ดูโค้ดบนขั้นตอนของปุ่มในแบบฟอร์มเพิ่ม
คำถาม: ค่าเริ่มต้นคือเวลาที่เพิ่มเรกคอร์ด
หากคุณใส่ค่าเริ่มต้น Now() ในช่อง ระบบจะตั้งเวลาในการเพิ่มบันทึกก่อนหน้า เช่น ค่าจะไม่อัปเดตเมื่อมีการเพิ่มบันทึก หากคุณกำหนดมาโครให้กับการเปลี่ยนแปลงในช่องโค้ด จะไม่มีอะไรเกิดขึ้น ฉันควรทำอย่างไร?
คำตอบ: 14,
ฉันไม่รู้ว่า "ง่ายกว่า" นั้นแตกต่างกันสำหรับทุกคน ขึ้นอยู่กับลักษณะเฉพาะของงาน ดังนั้นทุกอย่างจึงสัมพันธ์กันมาก
ในโปรแกรมของฉัน ผู้ใช้จะนั่งอยู่ในทะเบียนใบแจ้งหนี้ ผู้ซื้อมา - แคชเชียร์กดปุ่ม "สร้างใบแจ้งหนี้" และหน้าต่างจะเปิดขึ้นพร้อมกับใบแจ้งหนี้ใหม่ ซึ่งเวลาในการสร้างจะถูกแทรกโดยอัตโนมัติ
คำถาม: การกำหนดหมายเลขในแบบสอบถามและการเลือกระเบียนตามเงื่อนไขการกำหนดหมายเลข
สวัสดี! ฉันไม่สามารถแก้ปัญหาได้ มีคำถามซึ่งบันทึกจะถูกเลือกตามเงื่อนไขบางประการ จำเป็นที่คำขอนี้จะต้องมีหมายเลขบรรทัดที่เป็นอิสระเช่น 1 2 3 4 5 6 เป็นต้น ขึ้นอยู่กับจำนวนบันทึกในคำขอ
นอกจากนี้ยังจำเป็นต้องเลือกเฉพาะ 3 บันทึกแรกตามเงื่อนไข
คำตอบ:ขอบคุณมาก! สำหรับการตัดสินใจ. ตอนนี้คุณได้บอกวิธีเลือก 3 บันทึกแรกจากคำขอแล้ว
ภารกิจหลักคือการเลือกสามระเบียนแรกในแบบสอบถาม ไม่จำเป็นต้องสร้างฟิลด์ที่มีหมายเลข ฉันต้องเลือกสามระเบียนแรกจากการสืบค้นตามเงื่อนไข ฉันคิดว่าถ้าคุณตั้งเงื่อนไขในช่องหมายเลขเกี่ยวกับการเลือกบันทึก<4 я выберу первые три записи в запросе, а вы мне подсказали как эту проблему решить гораздо проще SELECT top 3 * спасибо.