尽管删除了所有数据,但插入后触发不起作用

Trigger after insert doesn't work although all data is deleted

我的 table 是空的,我试图插入一条记录,条件是位类型列不为真,因为每个国家的真条件只能出现一次。这是我的触发器:

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

这一行 select @Pays = REL_PAYS from inserted 造成了经典的 SQL 服务器触发器错误 - 假设 Inserted 伪 table 中只有一行 -实际上可能有很多。

您并不真的需要 Inserted table 来执行您的测试。相反,只需检查真实的 table 是否有任何重复项以及是否有回滚。

我想你想要的是:

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