Триггер после вставки не работает, хотя все данные удалены - PullRequest
0 голосов
/ 27 апреля 2020

Моя таблица пуста, и я пытаюсь вставить запись с условием, что столбец битового типа неверен, поскольку истинное условие может быть только один раз для каждой страны. Вот мой триггер:

ALTER TRIGGER [dbo].[Trg_PreventDefaultDevise] 
ON [dbo].[RELDEVISEPAYS]
AFTER INSERT, UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    DECLARE @Pays varchar(2);
    DECLARE @Compte int = 0;

    --select @Default = Rel_Default from Inserted;

    SELECT @Pays = REL_PAYS FROM inserted
    PRINT @Pays

    SET @Compte = (SELECT COUNT(rel_pays) FROM inserted 
                   WHERE Rel_Pays = @Pays AND Rel_Defaut = 0)
    PRINT @compte;

    IF (SELECT COUNT(*) FROM RELDEVISEPAYS 
        WHERE REL_DEFAUT = 1 AND REL_PAYS = @Pays) >= 1
    BEGIN
        RAISERROR (N'Ce pays dispose déjà d''une devise par défaut', 16, 1)
        ROLLBACK
        RETURN
    END
END

1 Ответ

1 голос
/ 27 апреля 2020

Эта строка select @Pays = REL_PAYS from inserted делает classi c SQL Ошибка триггера сервера - при условии, что в таблице псевдо-таблицы Inserted будет только одна строка - хотя на самом деле их может быть много.

Вам не нужен стол Inserted для проведения теста. Вместо этого просто проверьте реальную таблицу на наличие дубликатов и, если есть откат.

Я думаю, что вы хотите:

alter trigger [dbo].[Trg_PreventDefaultDevise] on [dbo].[RELDEVISEPAYS]
after insert, update
as
begin
    set nocount on;

    if exists (select 1 from dbo.RELDEVISEPAYS where REL_DEFAUT = 1 group by REL_PAYS having count(*) > 1)
    begin
        raiserror (N'Ce pays dispose déjà d''une devise par défaut',16,1);
        rollback;
    end;
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...