วิธีสร้างทริกเกอร์ที่อัปเดตฟิลด์วันที่และฟิลด์เวลาเมื่อแก้ไขแถว


10

ฉันสร้างตาราง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ฟิลด์ (หรือถ้าเป็นไปได้?)


คุณเคยดูว่ามีการสร้างทริกเกอร์หรือไม่?

ใช่ฉันได้ดูว่ามีการสร้างทริกเกอร์อย่างไร (Ref: msdn.microsoft.com/en-us/library/ms189799(v=sql.105).aspx ) แต่สิ่งหนึ่งที่รบกวนฉันคือสิ่งหนึ่งแทรก UPDATE ได้อย่างไร คำสั่งสำหรับแถวที่กำลังถูกทริกเกอร์โดยการทำให้เงื่อนไขถูกต้องเหมือนในWHERE id = Changed_Row_ID
แจ็ค

คำตอบ:


8

มันจะค่อนข้างง่าย แต่จริง ๆ แล้วฉันขอแนะนำให้เปลี่ยนตรรกะของคำสั่งที่แทรก / อัปเดตข้อมูลเพื่อที่จะเพิ่มข้อมูลเพิ่มเติม ณ จุดนี้

อย่างไรก็ตามหากคุณต้องการดำเนินการกับทริกเกอร์คุณสามารถทำสิ่งนี้:

create trigger my_trigger
on my_table
after insert, update
as
begin
declare @dt datetime = getdate();
update a
set expire_date = CONVERT(DATE, @dt, 101),
    expire_time = CONVERT(TIME, @dt)
from my_table as a
join inserted as b 
on a.product_no = b.product_no; 
end
go  

สิ่งนี้ใช้INSERTEDตารางเพื่อค้นหาproduct_noแถวที่มีการเปลี่ยนแปลง / สร้างขึ้น คุณสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับทริกเกอร์ได้ที่ลิงค์ด้านล่าง:

http://msdn.microsoft.com/en-us/library/ms189799.aspx

ฉันหวังว่านี่จะช่วยคุณได้


ฉันไม่เคยคิดว่า MS SQL จะสร้างตารางที่เรียกว่าinsertedจริง ๆ ดังนั้นหมายความว่าจะปลอดภัยหรือไม่ที่จะไม่มีตารางฐานข้อมูลของคุณเองที่จะมีชื่อเช่นนั้นinsertedและdeleted?
แจ็ค

1
ใช่ฉันอยากจะแนะนำไม่ให้มีตารางของคุณด้วยชื่อเหล่านี้เพียงเพื่อหลีกเลี่ยงความสับสน ;-)
Mr.Brownstone

ในหน้าสร้างทริกเกอร์ด้วยตนเองคุณจะพบลิงค์ไปยังหน้าต่อไปนี้ซึ่งอธิบายถึงการใช้ตารางที่แทรก / ลบ ( msdn.microsoft.com/en-us/library/ms191300.aspx )
miracle173
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.