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