Sql server SQL Server触发器中出现错误

Sql server SQL Server触发器中出现错误,sql-server,triggers,Sql Server,Triggers,我第一次写了一个触发器。我想检查一下,如果value=4,那么Exon,Date Fin,Date dé,但不能为空 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_Cat

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

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,État 1,tgrèu Susttva程序,Ligne 13
非有效名称:“N_CatCompta”

Msg 207,Niveau 16,État 1,tgrèu Susttva程序,Ligne 13
非有效性名称:“外显子°”

Msg 207,Niveau 16,État 1,tgrèu Susttva程序,Ligne 13
非有效名称:“日期财务”

Msg 207,Niveau 16,État 1,tgrèu Susttva程序,LINGE 14
非有效名称:“日期但”


触发器不是约束数据并在插入试图破坏规则时引发错误的最佳方法

最好的方法是使用约束。即使是这样复杂的规则也可以通过简单的

更改表dbo.F\u COMPTET
添加约束chkCompta4检查(N_CatCompta4或
([Exon°]不是空的
并且[日期Fin]不为空
并且[Date début]不为空
));
将此约束添加到表中,任何试图破坏此规则的插入都将引发约束冲突错误


当一行违反规则时,如果您希望向另一个表中插入数据,则触发器将非常有用。但只要您只处理一个表,就不需要触发器。

尽管我认为Tab Alleman发布的检查约束是一种更好的方法,但您可能会被触发器卡住


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

这里有两个主要问题。用于填充变量的select语句没有FROM子句。更大的问题是在触发器中使用标量变量。在sql server中,每个操作触发一次,而不是每行触发一次。您需要引用插入的虚拟表并适当地处理代码。很可能存在。我没有从中看到
,因为
选择
@SeanLange您的评论几乎涵盖了整个问题,我认为您应该添加它作为答案实际上,如果您只想引起错误,通过检查约束而不是触发器,你可以做得更好。我认为@TabAlleman的答案是最好的选择。如果您在使用触发器时处于死机状态,请阅读我之前的评论,因为这对于理解触发器的工作方式至关重要。我尝试了您的代码,但收到错误消息547,级别16,状态0,第1行。ALTER TABLE语句与CHECK约束“chkCompta”冲突。冲突发生在“SONELECT”数据库表“dbo.F_COMPTET”中。我使用触发器是因为当N_CatCompta时([Exon°]不为NULL,[Date Fin]不为NULL,[Date début]当用户tryes to insertOK时不为NULL,否。您只运行一次Alter Table。您没有将其放入触发器中。事实上,您删除了触发器,但根本没有触发器。错误表明您正在尝试添加一个已经存在的约束,所以您应该已经很好了。好的,但我想在该约束被禁用时显示一条个性化消息Brokie您必须在执行插入的代码中执行此操作。捕获约束错误并发出不同的错误消息。我将我的trger设置为:
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
));