Máy chủ SQL SAU KHI kích hoạt


10

Tôi muốn kích hoạt này được kích hoạt sau khi chèn được thực hiện với văn bản marriedtrên marital_statuscột, đây là những gì tôi có cho đến nay

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

Câu trả lời:


11

Vấn đề bạn sẽ gặp phải ở đây xuất phát từ việc SQL Server không có trình kích hoạt "FOR MACHI ROW" mà Oracle thực hiện. Bạn phải viết các trình kích hoạt của mình để xử lý các thay đổi nhiều hàng, tức là các bảng ảo XÁC NHẬN hoặc XÓA có thể có nhiều hơn một hàng trong đó.

Nếu một bản cập nhật như vậy xảy ra, trình kích hoạt của bạn sẽ thất bại, vì (SELECT [marital_status] FROM inserted)sẽ trả về nhiều hàng và các truy vấn con phải trả về một giá trị duy nhất được sử dụng trong so sánh trực tiếp.

Kích hoạt có thể sẽ phải trông giống như thế này:

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

Vì vậy, kích hoạt này thực sự khá gần với những gì bạn cần. Bây giờ vấn đề ở đây là chỉ có một hàng sẽ được chèn vào application_marẩu_info nếu có bất kỳ hàng nào được chèn vào. Đây có phải là những gì bạn thực sự muốn? Điều gì xảy ra nếu có nhiều hàng được chèn cùng một lúc?

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

Có lẽ bạn sẽ cần nhiều cột hơn những gì tôi đã thể hiện.


Nó nên được thực hiện mỗi khi dữ liệu này được nhập
kabuto178

2
Sau đó, một cách là thay thế phần cuối cùng bằngBEGIN INSERT INTO [dbo].[applicant_marriage_info]([dom]) SELECT 'abc' FROM inserted WHERE marital_status = 'married' END
ypercubeᵀᴹ

Tôi đã thay đổi mã mẫu một chút để giải thích cho việc này. Bạn không cần bit IF EXISTS nữa. Chỉ cần chạy truy vấn chống lại chèn và tải dữ liệu đó vào bảng khác. Có thể bạn sẽ cần nhiều cột hơn tôi đã hiển thị, một số loại ID có thể, nhưng bạn có thể có ý tưởng.
mrdenny
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.