คำถามติดแท็ก trigger

รหัสขั้นตอนดำเนินการโดยอัตโนมัติในการตอบสนองต่อเหตุการณ์ฐานข้อมูล

1
ทริกเกอร์ร่วมกับการทำธุรกรรม
สมมติว่าเรามีสถานการณ์ต่อไปนี้: เรามีตาราง (พูด Let 's Table_A), INSERTชมีทริกเกอร์บน งานทริกเกอร์คือการอัพเดตบางแถวtable_Btable_Aขึ้นอยู่กับค่าที่แทรกอยู่ใน ตอนนี้ทุกอย่างก็โอเคเมื่อเราแทรกแถวในตารางอย่างง่าย แต่แล้วสถานการณ์ที่เราแทรกข้อมูลผ่านการทำธุรกรรมล่ะ ทริกเกอร์จะรอจนกว่าคำสั่งการทำธุรกรรมทั้งหมดจะทำงานได้สำเร็จหรือจะถูกเรียกใช้ทันทีที่มันรับรู้ถึงการแทรก? หากทริกเกอร์ยิงทันทีเมื่อรับรู้การแทรกครั้งแรกจะเกิดอะไรขึ้นถ้าทรานแซคชันล้มเหลวในแถวสุดท้าย มีกลไกสำหรับสถานการณ์นั้นไหม

2
ทริกเกอร์รวบรวมในแต่ละครั้งหรือไม่
เรากำลังแก้ไขปัญหาเซิร์ฟเวอร์ที่มีการใช้งาน CPU สูง หลังจากพบว่าคำค้นหาไม่ได้เป็นสาเหตุของปัญหาจริงๆเราเริ่มมองหาการรวบรวม การตรวจสอบประสิทธิภาพแสดงน้อยกว่า 50 การคอมไพล์ / วินาทีและน้อยกว่า 15 การคอมไพล์ / วินาที หลังจากใช้งานเซสชัน XE เพื่อค้นหาการรวบรวมเราจะเห็นการรวบรวมนับพันต่อวินาที ระบบนี้ใช้ทริกเกอร์เพื่อตรวจสอบการเปลี่ยนแปลง การรวบรวมส่วนใหญ่เกิดจากทริกเกอร์ ทริกเกอร์การอ้างอิง sys.dm_tran_active_transactions ความคิดแรกของเราคือการอ้างอิง DMV ในทริกเกอร์อาจทำให้คอมไพล์ในแต่ละครั้งหรืออาจเป็นเพียง DMV ที่เจาะจงนี้จะทำให้เกิดขึ้น ดังนั้นฉันจึงเริ่มทดสอบทฤษฎีนั้น มันจะรวบรวมในแต่ละครั้ง แต่ฉันไม่ได้ตรวจสอบว่ามีการทริกเกอร์รวบรวมในแต่ละครั้งจะถูกเรียกเมื่อมันไม่ได้อ้างอิง DMV และแทน hardcodes ค่า มันยังคงรวบรวมทุกครั้งที่มันถูกเรียก การปล่อยไกหยุดการรวบรวม เรากำลังใช้ sqlserver.query_pre_execution_showplan ในเซสชั่น XE เพื่อติดตามการคอมไพล์ ทำไมจึงมีความคลาดเคลื่อนระหว่างสิ่งนั้นกับตัวนับ PerfMon เป็นเรื่องปกติหรือไม่ที่คุณได้รับเหตุการณ์การคอมไพล์ทุกครั้งที่ทริกเกอร์รัน? สคริปต์ Repro: CREATE TABLE t1 (transaction_id int, Column2 …

1
มีวิธีที่ดีในการเรียกใช้ทริกเกอร์สำหรับแต่ละระเบียนในตาราง postgres หรือไม่?
ฉันมีระบบที่ฉันไม่สามารถควบคุมการออกแบบของบางตาราง (ทำซ้ำผ่าน Slony-I) และดังนั้นฉันจึงมีชุดของสิ่งที่เราอ้างถึงเป็น 'shadow tables' ซึ่งฉันดึงข้อมูลบางส่วนออกจากตารางที่จำลองแบบแล้ว และเก็บไว้ในแบบฟอร์มการประมวลผลที่ฉันต้องการในขณะที่แยกระเบียนที่ฉันต้องการละเว้น ตอนนี้หลังจากตั้งค่าแบบจำลองใหม่ฉันเรียกใช้การอัปเดตและตั้งค่ากลับเป็นของตัวเอง (เช่นUPDATE tablename SET field=field) เพื่อบังคับให้ทริกเกอร์ทำงาน แต่ตารางบางตารางมีระเบียนนับล้านและเติบโตและใช้เวลา 30 นาที . (แล้วมีวัคซีนด้วย) มีวิธีที่ดีกว่าในการทริกเกอร์มันหรือวิธีเขียนฟังก์ชั่นบางอย่างเพื่อให้ทำงานกับอินพุตที่ส่งผ่านหรือNEWขึ้นอยู่กับบริบทการโทร? ฉันลังเลที่จะเก็บฟังก์ชั่นที่แตกต่างกันสองอย่างเอาไว้เพราะฉันเห็นหลายครั้งที่มีการอัปเดต

4
วิธี จำกัด จำนวนแถวสูงสุดในตารางให้เหลือเพียง 1
ฉันมีตารางการกำหนดค่าในฐานข้อมูล SQL Server ของฉันและตารางนี้ควรมีแถวเดียวเท่านั้น เพื่อช่วยให้นักพัฒนาในอนาคตเข้าใจสิ่งนี้ฉันต้องการป้องกันไม่ให้มีการเพิ่มข้อมูลมากกว่าหนึ่งแถว ฉันเลือกที่จะใช้ทริกเกอร์สำหรับสิ่งนี้ดังนี้ ... ALTER TRIGGER OnlyOneConfigRow ON [dbo].[Configuration] INSTEAD OF INSERT AS BEGIN DECLARE @HasZeroRows BIT; SELECT @HasZeroRows = CASE WHEN COUNT (Id) = 0 THEN 1 ELSE 0 END FROM [dbo].[Configuration]; IF EXISTS(SELECT [Id] FROM inserted) AND @HasZeroRows = 0 BEGIN RAISERROR ('You should not …

1
ฉันควรเพิ่ม SET NOCOUNT ON ให้กับตัวกระตุ้นทั้งหมดของฉันหรือไม่?
เป็นความรู้ทั่วไปที่คุณควรมี SET NOCOUNT ON โดยค่าเริ่มต้นเมื่อสร้างขั้นตอนการจัดเก็บใหม่ Microsoft ได้เปลี่ยนเทมเพลตเริ่มต้นเพื่อรวมสิ่งนี้ในปี 2012 ฉันคิดว่านี่จะเป็นสิ่งเดียวกันสำหรับทริกเกอร์ แต่ก็ไม่ได้รวมอยู่ในเทมเพลต มันเป็นความตั้งใจหรือเป็นเพียงการกำกับดูแล?

1
วิธีล้างข้อมูลเร็วที่สุดคืออะไร
สถานการณ์: เรามีสองตารางTbl1& Tbl2บนเซิร์ฟเวอร์สมาชิก Tbl1จะถูกจำลองแบบจากสำนักพิมพ์Server Aและมันมีสองทริกเกอร์ - แทรกและการปรับปรุง Tbl2ทริกเกอร์แทรกและปรับปรุงข้อมูลลงใน ตอนนี้เราต้องกำจัด (ประมาณ 900 ล้านบันทึก) จากTbl2ที่มีทั้งหมด 1,000+ ล้านบันทึก ด้านล่างคือการกระจายข้อมูลสำหรับหนึ่งเดือนถึงหนึ่งนาที หนึ่งเดือน - 14986826 แถว หนึ่งวัน - 483446 แถว หนึ่งชั่วโมง - 20143 แถว หนึ่งนาที - 335 แถว สิ่งที่ฉันกำลังมองหา วิธีที่เร็วที่สุดในการล้างข้อมูลนั้นโดยไม่มีปัญหาการผลิตความสอดคล้องของข้อมูลและอาจไม่มีการหยุดทำงาน ดังนั้นฉันคิดว่าจะทำตามขั้นตอนด้านล่าง แต่ติดอยู่ :( ขั้นตอน: BCP จากข้อมูลที่ต้องการจากตาราง Tbl2 ที่มีอยู่ (ประมาณ 100 ล้านบันทึกอาจใช้เวลาประมาณ 30 นาที) สมมติว่าฉันเริ่มทำกิจกรรมในวันที่ 1Fab2018 10:00 …

2
ทริกเกอร์: ย้ายแถวที่ถูกลบไปยังตารางเก็บถาวร
ฉันมีตารางเล็ก ๆ (~ 10 แถว) ที่เรียกว่าrestrictionsในฐานข้อมูล PostgreSQL ของฉันซึ่งค่าจะถูกลบและแทรกทุกวัน ฉันต้องการเรียกตารางrestrictions_deletedที่ซึ่งทุกแถวที่ถูกลบrestrictionsจะถูกเก็บไว้โดยอัตโนมัติ เนื่องจากrestrictionsมีรหัสซีเรียลจะไม่มีการทำซ้ำ ฉันจะเขียนทริกเกอร์ใน PostgreSQL ได้อย่างไร

3
ฉันจะวางทริกเกอร์ทั้งหมดในฐานข้อมูลเดียวได้อย่างไร
ฉันมีฐานข้อมูล 104 ทริกเกอร์มีวิธีลบทริกเกอร์ทั้งหมดด้วยคำสั่งเดียวจากฐานข้อมูลเดียวที่เรียกว่า 'system_db_audits หรือไม่

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

4
เรียกกระบวนงานที่เก็บไว้จากทริกเกอร์
ฉันได้สร้างกระบวนงานที่เก็บไว้ใน mysql โดยใช้ไวยากรณ์ต่อไปนี้ DROP PROCEDURE IF EXISTS `sp-set_comment_count`; DELIMITER $$ CREATE PROCEDURE `sp_set-comment_count` (IN _id INT) BEGIN -- AC - AllCount DECLARE AC INT DEFAULT 0; SELECT COUNT(*) AS ac INTO AC FROM usergroups AS ug LEFT JOIN usergroup_comments AS ugm ON ugm.`gid` = ug.`id` LEFT JOIN mediagallery AS dm …

3
การลบระเบียนช้าเมื่อเปิดใช้งานทริกเกอร์
ความคิดนี้ได้รับการแก้ไขด้วยลิงก์ด้านล่าง - งานแก้ไข - แต่โปรแกรมแก้ไขไม่ได้ ทำงานกับฝ่ายสนับสนุนของ Microsoft เพื่อแก้ไขปัญหา http://support.microsoft.com/kb/2606883 ตกลงดังนั้นฉันมีปัญหาที่ฉันต้องการจะออกไป StackOverflow เพื่อดูว่ามีใครมีความคิด หมายเหตุนี่คือกับ SQL Server 2008 R2 ปัญหา: การลบ 3000 รายการจากตารางที่มีระเบียน 15000 รายการใช้เวลา 3-4 นาทีเมื่อเปิดใช้งานทริกเกอร์และเพียง 3-5 วินาทีเมื่อปิดการใช้งานทริกเกอร์ การตั้งค่าตาราง เราจะเรียกสองโต๊ะหลักและรอง มัธยมศึกษามีบันทึกรายการที่ฉันต้องการลบดังนั้นเมื่อฉันลบฉันเข้าร่วมในตารางรอง กระบวนการทำงานก่อนคำสั่งลบเพื่อเติมข้อมูลตารางรองที่มีระเบียนที่จะถูกลบ ลบคำชี้แจง: DELETE FROM MAIN WHERE ID IN ( SELECT Secondary.ValueInt1 FROM Secondary WHERE SECONDARY.GUID = '9FFD2C8DD3864EA7B78DA22B2ED572D7' ); ตารางนี้มีคอลัมน์จำนวนมากและดัชนี NC …

3
เป็นไปได้หรือไม่ที่จะได้รับ call call สำหรับการเรียกใช้งานในทริกเกอร์?
ฉันมี 10 โพรซีเดอร์ที่เก็บไว้และแต่ละอันจะแทรกลงในหนึ่ง tableX เป็นไปได้หรือไม่ที่ทริกเกอร์เนื้อความของ tableX จะได้รับวัตถุใดที่ทำให้เกิดการดัดแปลง tableX (เก็บไว้ proc1 หรือ sp2 หรือ .... )? ขอขอบคุณ.

3
SQL Server: วิธีการปิดการใช้งานทริกเกอร์สำหรับการปรับปรุงสำหรับเซสชั่นปัจจุบันของคุณเท่านั้น?
ฉันกำลังทำงานกับ SQL Server 2008 R2 ผมมีตารางผลประโยชน์ที่มีหลัง INSERT, UPDATE ทริกเกอร์ชื่อtiu_benefit ฉันต้องการเขียนคำสั่ง UPDATE สำหรับตารางนี้เพื่ออัปเดต 1 แถว แต่ฉันไม่ต้องการให้ทริกเกอร์เริ่มทำงาน ฉันรู้ว่าฉันสามารถปิดการใช้งานทริกเกอร์ก่อน UPDATE แล้วเปิดใช้ทริกเกอร์หลัง UPDATE: DISABLE TRIGGER tiu_benefit ON benefit; GO UPDATE benefit SET editor = 'srh' where benefit_id = 9876 GO ENABLE TRIGGER tiu_benefit ON benefit; GO แต่สิ่งนี้จะปิดการใช้งานและเปิดใช้งานทริกเกอร์จะส่งผลกระทบต่อผู้ใช้ทั้งหมดที่เข้าสู่ระบบในปัจจุบัน ดังนั้นจึงมีความเป็นไปได้ที่ผู้ใช้รายอื่นเรียกใช้ UPDATE / INSERT ในขณะที่ทริกเกอร์ถูกปิดใช้งานโดยสคริปต์ของฉันซึ่งไม่ดี นั่นเป็นเหตุผลที่ฉันต้องการปิดใช้งานและเปิดใช้งานทริกเกอร์สำหรับเซสชันปัจจุบันของฉันเท่านั้น เป็นไปได้ไหม? …

1
เป็นไปได้หรือไม่ที่จะแก้ไข definition ทริกเกอร์ที่มีอยู่ใน MySQL?
ฉันสงสัยว่าเป็นไปได้หรือไม่ที่จะอัพเดทคำจำกัดความของทริกเกอร์ใน MySQL ตัวอย่างเช่นฉันมีทริกเกอร์ T และฉันต้องการเพิ่มฟังก์ชันใหม่บางอย่างลงไป ข้อสันนิษฐานของฉันคือฉันต้องวางและสร้างใหม่ แนวทางปฏิบัติที่ดีที่สุดในการบริหารฐานข้อมูลสำหรับสถานการณ์ดังกล่าวคืออะไร
14 mysql  trigger  update 

2
ทริกเกอร์เป็น UPDATE หลังจาก UPDATE หรือไม่
ฉันต้องการทริกเกอร์บันทึกเวลาของการอัปเดตใด ๆ เป็น: CREATE TRIGGER col_update AFTER UPDATE ON col FOR EACH ROW BEGIN UPDATE col SET updated=NOW() WHERE id=NEW.id; // or OLD.id END ปัญหาคือเมื่อทริกเกอร์นี้พยายามอัปเดตupdatedคอลัมน์มันก็เป็นอีกเหตุการณ์หนึ่งของการอัพเดทที่รันทริกเกอร์ สิ่งนี้จะสร้างการวนซ้ำไม่สิ้นสุดซึ่งไม่ทำงาน ฉันจะจัดเก็บเวลาอัปเดตในคอลัมน์ที่เกี่ยวข้องได้อย่างไร ฉันต้องการใช้ทริกเกอร์เนื่องจากมีหลายคอลัมน์ในตาราง หากฉันพยายามตั้งเวลาอัปเดตด้วยตนเองฉันจะต้องแก้ไขข้อความค้นหาจำนวนมาก

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