SQL Server触发器出错

时间:2016-03-08 16:37:17

标签: sql-server triggers

我是第一次写一个触发器。我想检查一下,如果value = 4,那么Exon N,Date Fin,Datedbut不能为空

CREATE TRIGGER tgr_suspTVA
   ON dbo.F_COMPTET
   AFTER INSERT
AS 
BEGIN
    DECLARE @N_CatCompta int, @ExonN varchar(69),
            @dateFin datetime, @dateDeb datetime 

    SELECT @N_CatCompta = N_CatCompta, 
           @ExonN = [Exon N°], 
           @dateFin = [Date Fin],
           @dateDeb = [Date début]

    IF (@N_CatCompta=4) AND (@ExonN IS NULL OR  @dateFin IS NULL OR @dateDeb IS NULL)
    BEGIN
          RAISERROR('error',16,1);
    END
END;

这是我得到的错误:

  

Msg 207,Niveau 16,État1,Procéduretgr_suspTVA,Ligne 13
  Nom de colonne non valide:'N_CatCompta'。

     

Msg 207,Niveau 16,État1,Procéduretgr_suspTVA,Ligne 13
  Nom de colonne non valide:'Exon N°'。

     

Msg 207,Niveau 16,État1,Procéduretgr_suspTVA,Ligne 13
  Nom de colonne non valide:'Date Fin'。

     

Msg 207,Niveau 16,État1,Procéduretgr_suspTVA,Ligne 14
  Nom de colonne non valide:'Datedébut'。

2 个答案:

答案 0 :(得分:1)

当插入尝试破坏规则时,触发器不是约束数据和引发错误的最佳方法。

执行此操作的最佳方法是使用约束。即使像这样的复杂规则也可以使用简单的CHECK constraint

来处理
ALTER TABLE dbo.F_COMPTET
ADD CONSTRAINT chkCompta4 CHECK (N_CatCompta<>4 OR 
([Exon N°] IS NOT NULL  
 AND [Date Fin] IS NOT NULL
 AND [Date début] IS NOT NULL
));

将此约束添加到您的表中,任何试图破坏此规则的插入都会引发约束违规错误。

如果在行违反规则时,您想要插入另一个表,则触发器将非常有用。但只要您只处理一个表,就不需要触发器。

答案 1 :(得分:0)

虽然我认为Tab Alleman发布的检查约束是一种更好的方法,但您可能会使用触发器。

如果是这种情况,那么这里有两个主要问题。用于填充变量的select语句没有FROM子句。更大的问题是您在触发器中使用标量变量。每次操作在sql server中触发一次,而不是每行一次。您需要引用插入的虚拟表并适当地处理您的代码。很可能存在。