2017-09-19 229 views
0

我对SQL Server中的触发器非常陌生,所以我希望有人能够帮助或至少将我指向正确的方向。SQL Server触发器在插入表之前验证数据

我有一个表有多个记录插入到它的作业我想在插入前验证这些记录,然后如果它不符合要求raiseerror。

我创建了一个视图,试图使之更容易解释什么,我试图做

SELECT TOP (100) PERCENT 
    iJCMasterID, 
    SUM(CASE WHEN ubJCTxSTNoProint = 1 
       THEN fTransQty * ufJCTxSTCustomerCharge 
       ELSE 0 
     END) AS CustCharge, 
    SUM(CASE WHEN iStockID = 5774 THEN 1 ELSE 0 END) AS ValidateJoblot, 
    SUM(CASE WHEN iStockID = 5774 THEN fUnitPriceExcl * fTransQty ELSE 0 END) AS JobTotal 
FROM 
    dbo._btblJCTxLines 
GROUP BY 
    iJCMasterID, dStartDate 
HAVING 
    (SUM(CASE WHEN iStockID = 5774 THEN 1 ELSE 0 END) > 0) 

所以一切都是由iJCMasterID分组,我需要基本确认包含CustCharge = Jobtotal但仅限于工作作业很多是在Having条款进场

如果你需要帮助的任何其他信息,请让我知道

谢谢你的提前

这是我迄今为止尝试,但似乎并不奏效

USE [*******DB] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE TRIGGER [dbo].[ValidateCC] ON [dbo].[_btblJCTxlines] for insert, update AS 

begin 
if exists(select COUNT(*) from inserted)--drop TRIGGER [dbo].[JobOverCreditLimit] 


declare @Jobamount float 

SET @Jobamount = (select sum(fLineTotalExcl) as JobAmount from inserted 
where iStockID = 5774 
GROUP BY inserted.iJCMasterID) 


declare @CCAmount float 

SET @CCAmount = (select sum(fTransQty * ufJCTxSTCustomerCharge) as JobAmount from inserted 
where ubJCTxSTNoProint = 1 
GROUP BY inserted.iJCMasterID) 


declare @Validation float 
set @Validation = (@Jobamount - @CCAmount) 

IF @Validation <> 0 
BEGIN 
DECLARE @EMSG VARCHAR(500) 

SET @EMSG = 'Customer Charge R' + CAST(@CCAmount AS VARCHAR(20))+' does not equal Job Amount R'+ CAST(@CCAmount AS VARCHAR(20))+ '' 
BEGIN 
rollback tran 
RAISERROR (@EMSG ,16, 1) 
end 
END 
end 
+3

为什么要存储该值?为什么不在需要时计算它? –

+0

嗨戈登我已经在我原来的帖子上做了一个编辑,实际上并不想将值存储在另一个表中,只是希望触发器在插入或引发错误之前将其插入帖子中以供引用,但它似乎并不正在工作 –

回答