我是第一次写扳机。我想检查如果值=4,则Exon N,Date Fin,Date dé,但不能为null
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é但”。
发布于 2016-03-08 17:00:11
当insert试图破坏规则时,触发器不是约束数据和引发错误的最佳方法。
要做到这一点,最好的方法就是使用约束。即使是这样的复杂规则也可以使用简单的检查约束来处理。
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
));将此约束添加到表中,任何试图打破此规则的插入都会引发违反约束的错误。
如果某一行破坏了您的规则,您想要对另一个表进行插入,则触发器将非常有用。但是,只要您只处理一个表,就不需要触发器。
发布于 2016-03-08 17:31:31
虽然我认为Tab Alleman发布的检查约束是一种更好的方法,但您可能会使用触发器。
如果是这样的话,这里有两个主要的问题。用于填充变量的select语句没有FROM子句。更大的问题是在触发器中使用标量变量。在sql server中,每个操作触发一次,而不是每一行一次。您需要引用插入的虚拟表并适当地处理代码。很可能是存在的。
https://stackoverflow.com/questions/35872898
复制相似问题