ทริกเกอร์เพื่อเพิ่มรายการใหม่ ทริกเกอร์ การประกาศ และการกำหนดทริกเกอร์ใน SQL การแก้ไขและการลบทริกเกอร์

ใน 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
1 2 3 4 เลือก TS.GOS№TS ชั่วโมงการทำงาน[ ไมล์สะสม (เวลาวิ่ง) ], [ เวลาวิ่งสำหรับงวด].[ รวม- ไมล์สะสม (เวลาวิ่ง) ], เวลาวิ่ง เดือน จาก [ เวลาวิ่งสำหรับงวด] เข้าร่วมภายใน (TC INNER JOIN Running time ON TC. GOS#TS = Running hours. [State TS#] ) ON [ running hours for the period] .GOS#TS = Running hours.[State TS#] GROUP BY TS.GOS#TS , ชั่วโมงการทำงาน[ระยะทาง (ชั่วโมงการทำงาน) ] , [ชั่วโมงการทำงานสำหรับช่วงเวลา] .[ ผลรวม- ไมล์สะสม (ชั่วโมง) ], ชั่วโมงเดือน HAVING (((Operations.Month) = forms! yourform! yourfieldlist) ) ) ;

คำถาม: การเพิ่มบันทึกลงในตารางตาม บันทึกที่มีอยู่


สวัสดี!
ฉันเพิ่งเริ่มเรียนรู้ 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 3 4 - SQL CurrentDb. ดำเนินการ stDocName END ย่อย

สาบานสองครั้ง:
1.กลไกจัดการฐานข้อมูลไม่พบตารางอินพุตหรือแบบสอบถาม
2.ไม่สามารถเพิ่มรายการทั้งหมดได้...

หากคุณไม่สามารถเพิ่มบันทึกทั้งหมดได้ ปล่อยมันไป! ไม่จำเป็นต้องแสดงข้อความแสดงข้อมูล (ไม่สามารถเพิ่มบันทึกทั้งหมดได้...)

ด้วยรหัสนี้:

รหัส SQL
1 2 3 แบบฟอร์มย่อยส่วนตัว_ปิด() DoCmd RunSQL CurrentDb. แบบสอบถามDefs( "gryCtryktyra_Izd_Berxn_Yrov_Kop_Modyli"- SQL END ย่อย

สาบาน 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 * спасибо.