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

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

2
ประสิทธิภาพของทริกเกอร์ vs ขั้นตอนการจัดเก็บใน MySQL
โพสต์ที่นี่ใน DBA.StackExchange ( อะไรคือแนวทางปฏิบัติที่ดีที่สุดสำหรับทริกเกอร์เพื่อรักษาหมายเลขการแก้ไขเรคคอร์ด? ) ทำให้เกิดคำถามที่น่าสนใจ (อย่างน้อยก็น่าสนใจสำหรับฉัน) เกี่ยวกับประสิทธิภาพใน MySQL บริบทคือเราต้องการแทรกระเบียนในตารางสำหรับแต่ละแถวที่มีการปรับปรุง ก่อนที่จะอัปเดตแถวเราต้องการเก็บค่าก่อนหน้าจากนั้นเพิ่มหนึ่งในคอลัมน์ (คอลัมน์ "รุ่น") หากเราทำสิ่งนี้ภายในทริกเกอร์มันจะทำงานได้ดี สำหรับ MySQL ทริกเกอร์เป็นแบบทีละแถวดังนั้นมันจึงเป็นทางออกที่ง่าย เลือกข้อมูลในตารางปัจจุบันแทรกลงในตารางการบันทึกและอัปเดตคอลัมน์ "version" ในข้อมูลใหม่ อย่างไรก็ตามเป็นไปได้ที่จะย้ายตรรกะนี้ไปยังกระบวนงานที่เก็บไว้ หากคุณทำเช่นนั้นคุณกำลังทำการแทรกแล้วเพิ่มคอลัมน์ "รุ่น" ในตาราง สิ่งทั้งหมดจะถูกตั้งค่าตาม ดังนั้นเมื่อมันมาถึงการแทรกนี้นี้จะมีประสิทธิภาพมากกว่าที่จะใช้วิธีการจัดเก็บตามชุดหรือวิธีการตามทริกเกอร์? คำถามนี้มีไว้สำหรับ MySQL (เนื่องจากมีทริกเกอร์แบบทีละแถว) แม้ว่าจะสามารถนำไปใช้กับ DBMS ทริกเกอร์แบบแถวต่อแถวอื่น ๆ ได้

1
การทริกเกอร์การยิงแม้จะไม่ได้รับผลกระทบ
นี่เป็นคำถามทั่วไปมากกว่า แต่แรงจูงใจสำหรับคำถามนี้เป็นปัญหาที่ฉันประสบขณะใช้ SQL Server ฉันมีทริกเกอร์นี้แนบกับเหตุการณ์แทรกบนตารางที่มีตรรกะบางอย่างซึ่งเป็นผลข้างเคียงจะเพิ่มข้อผิดพลาดหากไม่มีแถวถูกแทรก เมื่อตรวจสอบเพิ่มเติมฉันพบว่ามีการยิงไกแม้จะไม่มีการแทรกแถว ภาษาที่ใช้ในMicrosoft Docs บนทริกเกอร์ DMLดูเหมือนจะขัดแย้งกับพฤติกรรมนี้: ทริกเกอร์ DML เป็นขั้นตอนการจัดเก็บชนิดพิเศษที่จะมีผลโดยอัตโนมัติเมื่อมีเหตุการณ์ DML เกิดขึ้นซึ่งมีผลต่อตารางหรือมุมมองที่กำหนดในทริกเกอร์ นี่เป็นพฤติกรรมเริ่มต้นใน DBMS หรือไม่ มีเหตุผลบางอย่างในการเริ่มต้นทริกเกอร์เมื่อไม่มีแถวที่ได้รับผลกระทบหรือไม่?

1
สิทธิ์ในทริกเกอร์เมื่อใช้ใบรับรองฐานข้อมูลข้าม
ฉันใช้ใบรับรองฐานข้อมูลข้าม ( ตามที่อธิบายโดย Erland Sommarskog ) เพื่อควบคุมการเข้าถึงฐานข้อมูลบางอย่างในสภาพแวดล้อมของฉัน (SQL Server 2008 R2) ฉันมีโพรซีเดอร์ที่เก็บไว้ในฐานข้อมูล A ซึ่งอัพเดตตารางในฐานข้อมูล B. มันใช้ได้กับโพรซีเดอร์ที่เก็บไว้ในฐานข้อมูล A และตารางในฐานข้อมูล B เสมอจนถึงตอนนี้ ฉันพยายามอัพเดทตารางใน db B แต่ตารางมีทริกเกอร์อยู่ ทริกเกอร์นี้กำลังแทรกข้อมูลเพิ่มเติมในตารางอื่นใน db B ฉันได้รับข้อผิดพลาด: ข่าวสารเกี่ยวกับ 916, ระดับ 14, สถานะ 1, กระบวนงาน table_trigger, บรรทัด 11 เซิร์ฟเวอร์หลัก "sql \ login" ไม่สามารถเข้าถึงฐานข้อมูล "B" ภายใต้บริบทความปลอดภัยปัจจุบัน ฉันพยายามให้สิทธิ์การแทรกสำหรับผู้ใช้ฐานข้อมูล B ที่เชื่อมโยงกับใบรับรองเพื่อแทรกลงในตารางอื่น แต่ไม่ได้แก้ไขข้อผิดพลาด ฉันมีตัวเลือกอื่นนอกเหนือจากการเปลี่ยนทริกเกอร์เพื่อใช้งานWITH …

1
เป็นวิธีที่ถูกต้องเพื่อให้แน่ใจว่ารายการที่ไม่ซ้ำกันในการออกแบบฐานข้อมูลชั่วคราวคืออะไร?
ฉันมีปัญหากับการออกแบบฐานข้อมูลชั่วคราว ฉันจำเป็นต้องรู้วิธีการตรวจสอบให้แน่ใจว่าฉันมีบันทึกการใช้งานเพียงหนึ่งเดียวสำหรับระยะเวลาที่กำหนดสำหรับร้านค้า ฉันได้อ่านคำตอบนี้แล้ว แต่ฉันเกรงว่าฉันไม่สามารถคาดหัวได้ว่าไกทำงานอย่างไร โดยเฉพาะอย่างยิ่งฉันจะทำงานที่กระตุ้นให้มีอยู่ของฉันที่ป้องกันการปรับปรุงเพื่อบันทึกและแทรกบันทึกใหม่แทน ปัญหาที่แท้จริงของฉันคือฉันไม่รู้วิธีป้องกัน Store จากวันที่มีผลมากกว่าหนึ่งวันเมื่อวันที่เสร็จสิ้นเป็นโมฆะ (เช่นป้องกันการบันทึก 2 รายการสำหรับร้านค้า) นี่คือสิ่งที่ฉันมี แต่มันช่วยให้ฉันสามารถแทรกบันทึกใหม่สำหรับร้านค้าที่มีวันที่มีประสิทธิภาพที่แตกต่างกัน นิยามของตาราง: /****** Object: Table [PCR].[Z_STORE_TEAM] Script Date: 05/09/2014 13:05:57 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[Z_STORE_TEAM]') AND type in (N'U')) DROP TABLE [Z_STORE_TEAM] GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id …

1
วิธีสร้างทริกเกอร์ที่อัปเดตฟิลด์วันที่และฟิลด์เวลาเมื่อแก้ไขแถว
ฉันสร้างตารางtesttableภายในฐานข้อมูลtestbaseที่มีโครงสร้างต่อไปนี้: product_no (int, not null) product_name (varchar(30), not null) price (money, null) expire_date (date, null) expire_time (time(7), null) อย่างไรก็ตามฉันจะเขียนทริกเกอร์อย่างไรเพื่อให้อัปเดตแถวเฉพาะที่มีการแก้ไข (หรืออัปเดตด้วยข้อมูลใหม่) และบันทึกวันที่แก้ไขลงในexpire_dateฟิลด์และเวลาแก้ไขในexpire_timeฟิลด์ (หรือถ้าเป็นไปได้?)

1
ทริกเกอร์และขั้นตอนการถ่ายโอนข้อมูล mysqldump สามารถ
มีวิธีการสร้าง mysqldump ซึ่งจะบันทึกทริกเกอร์และขั้นตอนทั้งหมดจากฐานข้อมูลที่ระบุหรือไม่? บางครั้งก่อนหน้านี้ฉันอ่านแล้วว่าmysqldumpจะช่วยทริกเกอร์ของฉันด้วย แต่มันก็ดูไม่เหมือนกัน คำถามที่สองของฉันคือฉันจะตรวจสอบในไฟล์ sql ได้อย่างไรถ้ามีทริกเกอร์อยู่

3
ทริกเกอร์ T-SQL เป็นวิธีที่ทำให้เกิดการเปลี่ยนแปลงที่เกิดขึ้นจริงเท่านั้น?
ฉันมีตารางทริกเกอร์ใน UPDATE และ INSERTที่เพิ่มแถวไปยังตารางอื่น จะต้องเพิ่มแถวต่อเมื่อมีการเปลี่ยนแปลงหนึ่งในสี่คอลัมน์ ฉันลองใช้ IF UPDATE (col) เพื่อทดสอบการเปลี่ยนแปลง แต่มีจุดบอด แค่ทดสอบว่ามีค่าบางอย่างเข้ามาฉันต้องไปให้ลึกกว่านี้ฉันต้องเปรียบเทียบค่าเก่ากับค่าใหม่เพื่อดูการเปลี่ยนแปลงที่แท้จริงเกิดขึ้น มันต้องทำงานกับทั้ง INSERT และ UPDATE ในกรณีของ UPDATE นั้นง่ายเพราะทั้งตารางที่ถูกแทรกและถูกลบมีค่าที่ฉันสามารถเปรียบเทียบได้ภายในทริกเกอร์ อย่างไรก็ตามสำหรับ INSERT เฉพาะตารางแทรกเท่านั้นที่มีค่า เพราะฉันต้องการทั้งหมดนี้ในทริกเกอร์เดียวกันฉันจะจัดการกรณี INSERT ได้อย่างไร นี่คือสคริปต์ของทริกเกอร์ที่ฉันต้องการแก้ไข: ALTER TRIGGER [dbo].[trATPerson_alter] ON [mydb].[dbo].[AT_Person] AFTER INSERT,UPDATE AS BEGIN SET NOCOUNT ON; -- Not all updates require a push IF (UPDATE([First_Name]) OR UPDATE([Last_Name]) OR …
9 t-sql  trigger 

1
เหตุใดการลบในมุมมองที่พาร์ติชันของฉันจึงทำให้การแทรกดัชนีแบบกลุ่ม?
ฉันมีมุมมองที่แบ่งพาร์ติชันซึ่งมีทริกเกอร์แทรกด้านล่าง (พาร์ติชัน Mans ไม่ดี) เมื่อฉันทำการลบฉันได้รับแผนแบบสอบถามด้านล่าง: delete from factproductprice where pricedate = '20170725' ทริกเกอร์ในมุมมอง: ALTER TRIGGER [dbo].[factProductPriceDelete] ON [dbo].[FactProductPrice] INSTEAD OF DELETE AS BEGIN IF @@ROWCOUNT = 0 RETURN; DECLARE @PriceDate DATE SELECT @PriceDate = CAST(PriceDate AS DATE) FROM DELETED IF @PriceDate BETWEEN '20140101' AND '20141231' BEGIN DELETE FROM dbo.FactProductPrice2014 WHERE …

4
ฉันจะทราบได้อย่างไรว่าขั้นตอนหรือทริกเกอร์ที่เก็บไว้กำลังใช้ตารางใน SQL Server 2008 R2
นี่เป็นกรณีที่ใน DB ที่ฉันกำลังตรวจสอบมีตารางเก็บถาวรซึ่งเก็บประวัติผู้ใช้และมีทริกเกอร์หรือขั้นตอนการจัดเก็บที่หลังจากลบแถวออกจากตารางนี้ในบางครั้งเพื่อหลีกเลี่ยงการมีขนาดใหญ่เกินไป เหมือนกันฉันไม่ได้ออกแบบฐานข้อมูลฉันแค่ทำการบำรุงรักษาแอปพลิเคชันที่ใช้ฐานข้อมูลนี้ดังนั้นฉันจึงไม่ทราบชื่อของขั้นตอนหรือทริกเกอร์ที่เก็บไว้สิ่งที่ฉันต้องการทำคือค้นหาโพรซีเดอร์ที่เก็บไว้นี้ หรือทริกเกอร์ตรวจสอบรหัสและปรับเปลี่ยนเพื่อปล่อยให้ "ประวัติผู้ใช้" นี้ยาวขึ้นในตาราง มีคนบอกให้ฉันตรวจสอบตาราง "sysobjects" ซึ่งฉันสามารถเห็นบางสิ่งบางอย่างที่มีชื่อเดียวกันของตารางได้ แต่นี่เป็นข้อมูลเดียวที่ฉันสามารถเรียกคืนได้คำแนะนำใด ๆ ขอบคุณ.

1
ฉันจะเขียนทริกเกอร์ที่เขียนสำหรับ Oracle ได้อย่างไรสำหรับ SQL Server
ฉันจะเขียนทริกเกอร์ที่เขียนขึ้นใหม่สำหรับ Oracle Server ได้อย่างไรสำหรับ SQL นี่คือรหัสทริกเกอร์ Oracle ของฉัน: CREATE OR REPLACE TRIGGER P000KUL_TEST BEFORE INSERT ON P000KUL REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW BEGIN SELECT TO_CHAR(SYSDATE, 'dd/mm/RRRR') INTO :NEW.SYSTEM_DATE FROM DUAL; SELECT TO_CHAR(SYSDATE, 'hh:mi') INTO :NEW.SYSTEM_TIME FROM DUAL; END;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.