SQL Server SETELAH INSERT memicu

10

Saya ingin pemicu ini dipecat setelah sebuah insert dibuat dengan teks marriedpada marital_statuskolom, inilah yang saya miliki sejauh ini

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
kabuto178
sumber

Jawaban:

11

Masalah yang akan Anda hadapi di sini berasal dari fakta bahwa SQL Server tidak memiliki "FOR EACH ROW" yang memicu Oracle. Anda harus menulis pemicu Anda untuk menangani perubahan multi-baris, yaitu tabel virtual INSERTED atau DELETED dapat memiliki lebih dari satu baris di dalamnya.

Jika pembaruan seperti itu terjadi, pemicu Anda akan gagal, karena (SELECT [marital_status] FROM inserted)akan mengembalikan beberapa baris, dan subquery harus mengembalikan nilai tunggal untuk digunakan dalam perbandingan langsung.

Pemicunya mungkin harus terlihat seperti ini:

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
db2
sumber
8

Jadi pemicu ini sebenarnya cukup dekat dengan apa yang Anda butuhkan. Sekarang masalahnya di sini adalah hanya satu baris yang akan dimasukkan ke dalam applicant_marriage_info jika ada baris yang dimasukkan. Apakah ini yang sebenarnya Anda inginkan? Apa yang terjadi jika ada beberapa baris yang dimasukkan sekaligus?

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

Anda mungkin akan membutuhkan lebih banyak kolom daripada yang saya tunjukkan.

mrdenny
sumber
Itu harus dilakukan setiap kali data ini dimasukkan
kabuto178
2
Maka salah satu caranya adalah mengganti bagian terakhir denganBEGIN INSERT INTO [dbo].[applicant_marriage_info]([dom]) SELECT 'abc' FROM inserted WHERE marital_status = 'married' END
ypercubeᵀᴹ
Saya telah mengubah sedikit kode sampel untuk menjelaskan hal ini. Anda tidak perlu JIKA ADA sedikit lagi. Jalankan saja kueri terhadap yang dimasukkan dan muat data itu ke tabel lainnya. Anda mungkin memerlukan lebih banyak kolom daripada yang saya tunjukkan, semacam ID mungkin, tetapi Anda mungkin mendapatkan idenya.
mrdenny