SQL Server หลังจากทริกเกอร์ INSERT


10

ฉันต้องการให้ทริกเกอร์นี้เริ่มทำงานหลังจากมีการแทรกข้อความmarriedในmarital_statusคอลัมน์นี่คือสิ่งที่ฉันมีจนถึงตอนนี้

ALTER TRIGGER [dbo].[marriage]
ON  [dbo].[applicant_personal_info]
AFTER INSERT
AS 
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
IF (SELECT [marital_status] FROM inserted) = 'married'
 BEGIN
     INSERT INTO [dbo].[applicant_marriage_info]([dom])
     VALUES('abc')
 END
END

คำตอบ:


11

ปัญหาที่คุณพบที่นี่มาจากข้อเท็จจริงที่ว่า SQL Server ไม่มีทริกเกอร์ "FOR EACH ROW" ที่ Oracle ทำ คุณต้องเขียนทริกเกอร์เพื่อจัดการกับการเปลี่ยนแปลงหลายแถวเช่นตารางเสมือน INSERTED หรือ DELETED สามารถมีได้มากกว่าหนึ่งแถว

หากการอัปเดตดังกล่าวเกิดขึ้นทริกเกอร์ของคุณจะล้มเหลวเนื่องจาก(SELECT [marital_status] FROM inserted)จะส่งคืนหลายแถวและแบบสอบถามย่อยจะต้องส่งคืนค่าเดียวเพื่อใช้ในการเปรียบเทียบโดยตรง

ทริกเกอร์อาจต้องมีลักษณะดังนี้:

CREATE TRIGGER [dbo].[marriage] ON  [dbo].[applicant_personal_info] FOR INSERT
AS 
BEGIN
    SET NOCOUNT ON
    IF EXISTS (SELECT [marital_status] FROM INSERTED WHERE marital_status = 'married')
    BEGIN
        INSERT INTO [dbo].[applicant_marriage_info] ([dom])
        SELECT
            'abc' --Replace with whatever you're really inserting
        FROM INSERTED
        WHERE marital_status = 'married'
    END
END

8

ทริกเกอร์นี้ค่อนข้างใกล้เคียงกับสิ่งที่คุณต้องการ ในตอนนี้ปัญหาที่เกิดขึ้นคือมีเพียงหนึ่งแถวเท่านั้นที่จะถูกแทรกเข้าไปใน นี่คือสิ่งที่คุณต้องการจริง ๆ ? จะเกิดอะไรขึ้นหากมีการแทรกหลายแถวพร้อมกัน

ALTER TRIGGER [dbo].[marriage]
ON  [dbo].[applicant_personal_info]
AFTER INSERT
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    INSERT INTO [dbo].[applicant_marriage_info]([dom])
    SELECT 'abc' 
    FROM inserted 
    WHERE marital_status = 'married'
END

คุณอาจต้องการคอลัมน์มากกว่าที่ฉันแสดง


ควรทำทุกครั้งที่มีการป้อนข้อมูลนี้
kabuto178

2
ดังนั้นวิธีหนึ่งคือการแทนที่ส่วนสุดท้ายด้วยBEGIN INSERT INTO [dbo].[applicant_marriage_info]([dom]) SELECT 'abc' FROM inserted WHERE marital_status = 'married' END
ypercubeᵀᴹ

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