首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server触发器中的错误

Server触发器中的错误
EN

Stack Overflow用户
提问于 2016-03-08 16:37:16
回答 2查看 120关注 0票数 1

我是第一次写扳机。我想检查如果值=4,则Exon N,Date Fin,Date dé,但不能为null

代码语言:javascript
复制
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,Ligne 1,Procédure tgr_suspTVA,Ligne 13 非安定性结肠镜:'N_CatCompta‘ Msg 207,Niveau 16,Ligne 1,Procédure tgr_suspTVA,Ligne 13 非安定性结肠镜:‘外显子N°’。 Msg 207,Niveau 16,Ligne 1,Procédure tgr_suspTVA,Ligne 13 非安定性结肠镜:‘日期Fin’。 Msg 207,Niveau 16,Ligne 1,Procédure tgr_suspTVA,Ligne 14 Nom de colonne:“Date dé但”。

EN

回答 2

Stack Overflow用户

发布于 2016-03-08 17:00:11

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

要做到这一点,最好的方法就是使用约束。即使是这样的复杂规则也可以使用简单的检查约束来处理。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-03-08 17:31:31

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35872898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档