尽管删除了所有数据,但插入后触发不起作用
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
我的 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