我是第一次写一个触发器。我想检查一下,如果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'。
答案 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中触发一次,而不是每行一次。您需要引用插入的虚拟表并适当地处理您的代码。很可能存在。