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

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

5
วิธีตรวจจับการเปลี่ยนแปลงใด ๆ ในฐานข้อมูล (DDL และ DML)
มีฐานข้อมูลจำนวนมากบนเซิร์ฟเวอร์ SQL ของลูกค้าของฉัน ฐานข้อมูลเหล่านี้อยู่ระหว่างการพัฒนาเพื่อให้นักพัฒนาสามารถออกแบบปรับโครงสร้างทำการแก้ไขข้อมูลและอื่น ๆ มีฐานข้อมูลบางส่วนที่เปลี่ยนแปลงได้ยาก ลูกค้าของฉันต้องรักษาความปลอดภัยทั้งหมด (สำรองข้อมูล) และใช้เวลาในการจัดการสภาพแวดล้อม (บริษัท ไม่มีตำแหน่งผู้ดูแลฐานข้อมูลที่ บริษัท ) หลังจากการสนทนาที่ยาวนานลูกค้าได้ตัดสินใจใช้กลยุทธ์การสำรองข้อมูลเต็มรูปแบบรายวันเนื่องจากความสะดวกในการกู้คืน ดังนั้นนี่คือบทสรุปของสถานการณ์: จำนวนฐานข้อมูลสามารถเปลี่ยนแปลงได้ทุกวัน ฐานข้อมูลที่เปลี่ยนแปลง (หมายถึงข้อมูลและ / หรือโครงสร้างที่มีการเปลี่ยนแปลง) จะถูกสำรอง ฐานข้อมูลที่ไม่เปลี่ยนแปลงจะไม่ถูกสำรอง โซลูชันจะไม่ส่งผลกระทบต่อโครงสร้างฐานข้อมูล (ไม่ จำกัด ข้อกำหนด) "เครื่องมือสำรอง" นี้จะทำงานโดยอัตโนมัติ ปัญหาหลัก: วิธีการตรวจสอบว่ามีการเปลี่ยนแปลงฐานข้อมูล ส่วนแรกของปัญหา (DDL เปลี่ยนแปลง) สามารถแก้ไขได้โดยการใช้ทริกเกอร์ DDL แต่การเปลี่ยนแปลงข้อมูล (การเปลี่ยนแปลง DML) เป็นปัญหา เป็นไปไม่ได้ที่จะใช้ทริกเกอร์ DML กับทุกตารางของฐานข้อมูลทั้งหมดเพื่อติดตามการเปลี่ยนแปลง (ประสิทธิภาพการจัดการวัตถุที่ขยายเพิ่ม ... ) เอ็นจิ้นการสำรองข้อมูลต้องติดตามการเปลี่ยนแปลงทั้งหมดเพื่อทำเครื่องหมายแต่ละฐานข้อมูลว่าพร้อมสำหรับการสำรองข้อมูล Change Data Captureเป็นวิธีแก้ปัญหา แต่ดูเหมือนว่าหนักเกินไป …

3
SQL แบบไดนามิกใน MySQL จัดเก็บเป็นประจำ
ตามข้อ จำกัด ของรูทีนและทริกเกอร์ที่เก็บไว้ไม่สามารถใช้ไดนามิก sql ได้ (ข้อ จำกัด ถูกยกขึ้นสำหรับโพรซีเดอร์ที่เก็บในเวอร์ชัน 5.0.13 และใหม่กว่า) เหตุใดจึงมีข้อ จำกัด นี้ และทำไมต้องยกมันสำหรับขั้นตอน แต่ไม่ใช่ฟังก์ชั่นหรือทริกเกอร์?

1
วิธีใช้ COLUMNS_UPDATED เพื่อตรวจสอบว่ามีการอัปเดตคอลัมน์ใดคอลัมน์หนึ่งหรือไม่
ฉันมีตารางที่มี 42 คอลัมน์และทริกเกอร์ซึ่งควรทำบางสิ่งเมื่อมีการอัปเดต 38 คอลัมน์เหล่านี้ ดังนั้นฉันต้องข้ามตรรกะหากส่วนที่เหลือ 4 คอลัมน์มีการเปลี่ยนแปลง ฉันสามารถใช้ฟังก์ชั่นUPDATE ()และสร้างIFเงื่อนไขที่ยิ่งใหญ่ได้แต่ต้องการทำสิ่งที่สั้นกว่า ใช้COLUMNS_UPDATEDฉันสามารถตรวจสอบว่าคอลัมน์ทั้งหมดมีการปรับปรุงได้หรือไม่ ตัวอย่างเช่นการตรวจสอบว่ามีการอัปเดตคอลัมน์ 3, 5 และ 9 หรือไม่: IF ( (SUBSTRING(COLUMNS_UPDATED(),1,1) & 20 = 20) AND (SUBSTRING(COLUMNS_UPDATED(),2,1) & 1 = 1) ) PRINT 'Columns 3, 5 and 9 updated'; ดังนั้นค่า20สำหรับคอลัมน์3และ5และค่า1สำหรับคอลัมน์9เนื่องจากถูกตั้งค่าในบิตแรกของไบต์ที่สอง หากฉันเปลี่ยนคำสั่งORเป็นจะตรวจสอบว่าคอลัมน์3และ5หรือคอลัมน์9นั้นมีการ / มีการปรับปรุง? จะใช้ORตรรกะในบริบทของหนึ่งไบต์ได้อย่างไร

2
"ตารางการเปลี่ยนแปลง" ใน Postgres คืออะไร
หน้าอธิบายว่ามีอะไรใหม่ใน Postgres 10กล่าวถึง "ตารางการเปลี่ยนผ่านสำหรับทริกเกอร์" ตารางการเปลี่ยนแปลงสำหรับทริกเกอร์ คุณลักษณะนี้ทำให้AFTER STATEMENTทั้งสองเป็นประโยชน์และมีประสิทธิภาพโดยการเปิดเผยแถวที่เก่าและใหม่ในแบบสอบถาม ก่อนที่คุณสมบัตินี้AFTER STATEMENTทริกเกอร์จะไม่สามารถเข้าถึงสิ่งเหล่านี้ได้โดยตรงและการแก้ไขปัญหาคือไบแซนไทน์และมีประสิทธิภาพต่ำ สามารถเขียนลอจิกลอจิกจำนวนมากได้AFTER STATEMENTโดยหลีกเลี่ยงความจำเป็นในการสลับบริบทที่มีราคาแพงในแต่ละแถวที่จำเป็นสำหรับทริกเกอร์แต่ละแถว ตารางการเปลี่ยนแปลงคืออะไร?

4
การรวบรวมข้อมูลจากตารางที่แตกต่างกันเป็นแบบฝึกหัดหรือไม่
พื้นหลัง ฉันเขียนรายงานขนาดใหญ่จำนวนมากและโดยทั่วไปแล้วรักษาฐานข้อมูลสุขภาพขนาดใหญ่ (เขียน SP, ฟังก์ชั่น, งาน, ฯลฯ ) สคีมาดั้งเดิมและซอฟต์แวร์ที่ใช้นั้นมาจากผู้จำหน่ายรายอื่นดังนั้นฉันจึงไม่สามารถเปลี่ยนแปลงโครงสร้างได้มากนัก มีบันทึกมากมายที่ต้องมีการติดตามเช่นห้องปฏิบัติการขั้นตอนวัคซีน ฯลฯ และพวกมันกระจัดกระจายไปทั่วโต๊ะหลายสิบแห่งซึ่งหลายแห่งถูกป่องและจัดทำดัชนีไม่ดี (ฉันสามารถแก้ไขปัญหานี้ได้บ้าง) ปัญหา ปัญหาคือเนื่องจากเรามีการควบคุม DB น้อยและเนื่องจากสามารถเปลี่ยนแปลงได้จากการอัพเดทหรือแพทช์ใด ๆ ทำให้การเขียนและการบำรุงรักษารายงานเหล่านี้ยากและน่าเบื่อโดยเฉพาะอย่างยิ่งเมื่อมีการทับซ้อนกันจำนวนมาก สิ่งที่ต้องทำคือแพทช์เดียวและฉันติดเขียนส่วนใหญ่ของรายงานโหล นอกจากนี้เคียวรีกลายเป็นสับสนและช้าลงเมื่อการรวมซ้อนเลือกและซ้อนกัน "ทางออก" ของฉัน แผนของฉันคือการเขียนระเบียนทั้งหมดเหล่านี้ลงในตาราง "catch-all" หนึ่งตารางและเขียนทริกเกอร์บนตารางดั้งเดิมเพื่อรักษาระเบียนในตารางรวมนี้ แน่นอนฉันต้องมั่นใจว่าตัวกระตุ้นของฉันยังคงอยู่หลังจากการอัพเดต แต่จะง่ายกว่ามากจากมุมมองการบำรุงรักษาและเพียงแค่อ้างอิงข้อมูล ตารางจะบางและยาวเก็บเฉพาะข้อมูลที่ต้องการเช่นนี้: CREATE TABLE dbo.HCM_Event_Log ( id INT IDENTITY, type_id INT NULL, orig_id VARCHAR(36) NULL, patient_id UNIQUEIDENTIFIER NOT NULL, visit_id UNIQUEIDENTIFIER NULL, lookup_id …

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

3
จะเปลี่ยนลำดับการยิงของ Triggers ได้อย่างไร?
จริงๆฉันไม่ค่อยใช้ทริกเกอร์ ดังนั้นฉันจึงพบปัญหาในครั้งแรก ฉันมีตารางจำนวนมากที่มีทริกเกอร์ (2 หรือมากกว่าสำหรับทุกตาราง) ฉันต้องการทราบและเปลี่ยนลำดับการเรียกทริกเกอร์สำหรับทุกตาราง เป็นไปได้หรือไม่ที่จะได้รับข้อมูลนี้? เพิ่ม: นี่คือบทความ enoght ที่ดีใน mssqltipsฉันได้พบ

5
ประสิทธิภาพการทำงานที่โหดร้ายเข้าร่วมตาราง INSERTED และ DELETED ในทริกเกอร์
ฉันได้รับทริกเกอร์ UPDATE ในตารางที่เฝ้าดูคอลัมน์ที่เฉพาะเจาะจงเปลี่ยนจากค่าหนึ่งไปเป็นค่าอื่น ๆ เมื่อสิ่งนี้เกิดขึ้นมันจะอัพเดทข้อมูลที่เกี่ยวข้องในตารางอื่นผ่านคำสั่ง UPDATE เดียว สิ่งแรกที่ทริกเกอร์ทำการตรวจสอบเพื่อดูว่าแถวที่อัพเดตมีค่าของคอลัมน์นี้เปลี่ยนจากค่าที่เป็นปัญหาหรือไม่ มันจะรวมเข้ากับ INSERTED เพื่อลบและเปรียบเทียบค่าในคอลัมน์นั้น หากไม่มีสิ่งใดที่มีคุณสมบัติมันจะออกไปก่อนกำหนดดังนั้นคำสั่ง UPDATE จะไม่ทำงาน IF NOT EXISTS ( SELECT TOP 1 i.CUSTNMBR FROM INSERTED i INNER JOIN DELETED d ON i.CUSTNMBR = d.CUSTNMBR WHERE d.CUSTCLAS = 'Misc' AND i.CUSTCLAS != 'Misc' ) RETURN ในกรณีนี้ CUSTNMBR เป็นคีย์หลักของตารางต้นแบบ หากฉันอัปเดตจำนวนมากในตารางนี้ (พูด, 5,000+ แถว) …

2
ทริกเกอร์ FOR FOR EACH STATEMENT จะเรียกใช้งานบ่อยแค่ไหนหากการดำเนินการเกิดจากข้อ จำกัด FK ที่มี CASCADE UPDATE
ผมเข้าใจว่าทริกเกอร์บนเสื้อตารางที่กำหนดไว้กับจะทำงานเมื่อตอนที่ผมดำเนินการFOR EACH STATEMENTUPDATE t ... ทีนี้เมื่อtถูกกำหนดด้วยFOREIGN KEY ... REFERENCES a ... ON UPDATE CASCADEและฉันอัพเดทแถว N แถวaนั่นจะทำให้ทริกเกอร์ถูกเรียกครั้งเดียวหรือครั้ง N หรือไม่? สิ่งที่แตกต่างกันคือการเปลี่ยนแปลงในตารางที่เรียงซ้อนกันโดยข้อ จำกัด FK เป็นแบบเดี่ยวUPDATEมากกว่าหรือมากกว่าแบบอนุกรมUPDATEหรือไม่?

3
การส่งข้อมูลเกี่ยวกับผู้ที่ลบระเบียนไปยังทริกเกอร์ลบ
ในการตั้งค่าหลักฐานการตรวจสอบฉันไม่มีปัญหาในการติดตามว่าใครกำลังอัปเดตหรือแทรกระเบียนในตารางอย่างไรก็ตามการติดตามผู้ที่ลบระเบียนดูเหมือนว่าจะมีปัญหามากกว่า ฉันสามารถติดตามส่วนแทรก / อัพเดตได้โดยใส่ในส่วนแทรก / อัปเดตฟิลด์ "UpdatedBy" นี้จะช่วยให้เรียก INSERT / UPDATE ให้มีการเข้าถึงช่อง "UpdatedBy" inserted.UpdatedByผ่านทาง อย่างไรก็ตามด้วยการลบทริกเกอร์ไม่มีข้อมูลถูกแทรก / ปรับปรุง มีวิธีการส่งผ่านข้อมูลไปยังทริกเกอร์การลบเพื่อที่จะได้รู้ว่าใครเป็นผู้ลบบันทึกหรือไม่? นี่คือทริกเกอร์การแทรก / อัปเดต ALTER TRIGGER [dbo].[trg_MyTable_InsertUpdate] ON [dbo].[MyTable] FOR INSERT, UPDATE AS INSERT INTO AuditTable (IdOfRecordedAffected, UserWhoMadeChanges) VALUES (inserted.ID, inserted.LastUpdatedBy) FROM inserted ใช้ SQL Server 2012

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

1
เหตุใดฉันจึงไม่ได้รับข้อผิดพลาดของการกลายพันธุ์ของตารางในทริกเกอร์
เป็นที่ทราบกันดีว่าคุณไม่สามารถใช้คำสั่ง DML ในตารางการกลายพันธุ์ภายในทริกเกอร์ ข้อความที่ตัดตอนมาจากเอกสารของ Oracle : ตารางกลายพันธุ์เป็นตารางที่ถูกแก้ไขโดยคำสั่ง UPDATE, DELETE หรือ INSERT หรือตารางที่อาจได้รับการปรับปรุงโดยผลกระทบของข้อ จำกัด DELETE CASCADE เซสชั่นที่ออกคำสั่งเรียกไม่สามารถสอบถามหรือแก้ไขตารางการกลายพันธุ์ ข้อ จำกัด นี้ป้องกันไม่ให้ทริกเกอร์เห็นชุดข้อมูลที่ไม่สอดคล้องกัน อย่างไรก็ตามฉันไม่เข้าใจว่าทำไมทริกเกอร์การสาธิตนี้ไม่ได้ล้มเหลวด้วยข้อผิดพลาด "การกลายพันธุ์ตาราง" เมื่อฉันทำการinsert into empใช้ SQL Developer หรือ SQL * Plus: CREATE OR REPLACE TRIGGER emp_bri BEFORE INSERT ON emp FOR EACH ROW BEGIN SELECT max(id) + 1 INTO :NEW.id FROM …

1
จะเช็คอินทริกเกอร์ได้อย่างไรถ้าทั้งแถวยังคงเหมือนเดิมหลังจากอัพเดท?
แน่นอนฉันสามารถทำได้สำหรับทุกคอลัมน์เปรียบเทียบเช่นนี้ if (old.column1 = new.column1 and old.column2 = new.column2...) แต่มันจะยากรหัส b และยากที่จะรักษาถ้าฉันเพิ่มคอลัมน์อื่นในอนาคตเช่น มีวิธีการตรวจสอบว่าคอลัมน์ทั้งหมดยังคงเหมือนเดิมหรือไม่โดยไม่ตรวจสอบทุกคอลัมน์ด้วยตนเอง?

2
การติดตามผู้ใช้ปัจจุบันผ่านมุมมองและทริกเกอร์ใน PostgreSQL
ฉันมีฐานข้อมูล PostgreSQL (9.4) ที่ จำกัด การเข้าถึงระเบียนขึ้นอยู่กับผู้ใช้ปัจจุบันและติดตามการเปลี่ยนแปลงที่ทำโดยผู้ใช้ สิ่งนี้ทำได้โดยการดูและทริกเกอร์และส่วนใหญ่ทำงานได้ดี แต่ฉันมีปัญหากับมุมมองที่ต้องมีINSTEAD OFทริกเกอร์ ฉันพยายามลดปัญหาลง แต่ฉันต้องขออภัยล่วงหน้าว่านี่ยังค่อนข้างนาน สถานการณ์ การเชื่อมต่อกับฐานข้อมูลทั้งหมดที่ทำจากเว็บ front-end dbwebผ่านบัญชีเดียว เมื่อเชื่อมต่อบทบาทที่มีการเปลี่ยนแปลงทางเพื่อให้สอดคล้องกับคนที่ใช้อินเตอร์เฟซเว็บและทุกบทบาทดังกล่าวอยู่ในบทบาทของกลุ่มSET ROLE dbuser(ดูคำตอบนี้สำหรับรายละเอียด) aliceสมมติว่าผู้ใช้ ส่วนใหญ่ของตารางของฉันจะอยู่ในสคีมาที่นี่ผมจะโทรหาและอยู่ในprivate dbownerตารางเหล่านี้ไม่สามารถเข้าถึงได้โดยตรงไปแต่จะไปอีกบทบาทหนึ่งdbuser dbviewเช่น: SET SESSION AUTHORIZATION dbowner; CREATE TABLE private.incident ( incident_id serial PRIMARY KEY, incident_name character varying NOT NULL, incident_owner character varying NOT NULL ); GRANT ALL ON TABLE private.incident …

1
การซิงโครไนซ์โดยใช้ทริกเกอร์
ฉันมีข้อกำหนดคล้ายกับการสนทนาก่อนหน้านี้ที่: การเขียนโครงสร้างธนาคารอย่างง่าย: ฉันจะรักษายอดคงเหลือของฉันให้สอดคล้องกับประวัติการทำธุรกรรมได้อย่างไร ทริกเกอร์ร่วมกับการทำธุรกรรม ฉันมีสองตาราง[Account].[Balance]และ[Transaction].[Amount]: CREATE TABLE Account ( AccountID INT , Balance MONEY ); CREATE TABLE Transaction ( TransactionID INT , AccountID INT , Amount MONEY ); เมื่อมีการแทรก update หรือลบกับ[Transaction]ตารางที่ควรได้รับการปรับปรุงขึ้นอยู่กับ[Account].[Balance][Amount] ขณะนี้ฉันมีทริกเกอร์ให้ทำงานนี้: ALTER TRIGGER [dbo].[TransactionChanged] ON [dbo].[Transaction] AFTER INSERT, UPDATE, DELETE AS BEGIN IF EXISTS (select 1 from [Deleted]) OR …

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