尽管删除了所有数据,插入后仍无法触发

问题描述 投票:0回答:1

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

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
sql sql-server tsql database-trigger
1个回答
1
投票

[此行select @Pays = REL_PAYS from inserted使经典的SQL Server触发错误-假设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
© www.soinside.com 2019 - 2024. All rights reserved.