SQL Server ПІСЛЯ ВКЛЮЧЕННЯ тригера


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 не має тригерів "ЗА ВСЯКОГО РОЗУМУ", що робить Oracle. Вам потрібно написати тригери для обробки змін у декількох рядках, тобто ВСТАНОВЛЕНІ або ВИДАЛЕНІ віртуальні таблиці можуть містити в них більше одного рядка.

Якщо таке оновлення сталося, ваш тригер не вдасться, оскільки (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

Тож цей тригер насправді дуже близький до того, що вам потрібно. Тепер проблема полягає в тому, що в заявник_marriage_info буде вставлений лише один рядок, якщо вставлені рядки. Це те, чого ти насправді хочеш? Що станеться, якщо одночасно вставлено кілька рядків?

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 EXISTS. Просто запустіть запит проти вставлених даних і завантажте ці дані в іншу таблицю. Вам, мабуть, знадобиться більше стовпців, ніж я показав, якийсь ідентифікатор, мабуть, але ви, мабуть, отримаєте ідею.
mrdenny
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.