Несколько операторов IF в триггере удаления - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь создать следующую логику c в SQL Триггере сервера:

  1. Проверьте, если Deleted.ProfID = 3
  2. Если Да, проверьте, если в tblPartLi c нет записей с ProfID = 3, затем
  3. Если нет, вставьте в tblParticipantLicense запись 3 без лицензии
    - a. idsNumber, txtEmailAddress, состояние = 70 состояние

Я пытался:

IF (deleted.idsProf = 3)
BEGIN

    IF NOT Exists(Select PL.idsNumber FROM tblPartLic PL INNER JOIN Deleted D 
        ON PL.idsNumber=D.idsNumber 
        WHERE PL.idsProfession = 3 AND PL.idsState <> 70)
    BEGIN

        INSERT INTO tblPartLic (idsNumber, txtLicNumber, txtState, txtProfOrg, 
                idsCountry, idsState, idsProf)
            SELECT Deleted.idsDASNumber, 'AR NL', 'NL', 'Architect', 208, 70, 3
            FROM Deleted 

    END;
END;            

1 Ответ

2 голосов
/ 07 апреля 2020

Deleted - это таблица (псевдотаблица), которая может содержать несколько строк, некоторые из которых могут иметь ProfID = 3, а некоторые - ProfId <> 3. Это должно быть обработано. Также реляционные базы данных предназначены для операций на основе набора, а не процедурных. Ваш лог c может быть встроен в один оператор вставки с соответствующим предложением where. Следующее воспроизводит то, что вы показали выше:

INSERT INTO tblPartLic (idsNumber, txtLicNumber, txtState, txtProfOrg, idsCountry, idsState, idsProf)
    SELECT D.idsDASNumber, 'AR NL', 'NL', 'Architect', 208, 70, 3
    FROM Deleted D
    -- Condition 1 - ProfID = 3
    WHERE D.ProfID = 3
    -- Condition 2 - No existing record in tblPartLic
    AND NOT EXISTS (
        SELECT PL.idsNumber
        FROM tblPartLic PL
        WHERE PL.idsProfession = 3 AND PL.idsState <> 70
        AND PL.idsNumber = D.idsNumber
    );
...