SQL Server 触发器在插入表之前验证数据
Posted
技术标签:
【中文标题】SQL Server 触发器在插入表之前验证数据【英文标题】:SQL Server trigger to validate data before insert on a table 【发布时间】:2017-09-19 10:58:14 【问题描述】:我对 SQL Server 中的触发器非常陌生,所以我希望有人可以帮助或至少为我指明正确的方向。
我有一个表,其中插入了与作业有关的多条记录,我想在插入之前验证这些记录,如果不符合要求则引发错误。
我创建了一个视图来尝试更容易解释我正在尝试做的事情
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
【问题讨论】:
为什么要存储这个值?为什么不直接在需要的时候计算呢? 嗨,戈登,我已经对我的原始帖子进行了编辑,实际上并不想将值存储在另一个表中,只是希望触发器在插入或引发错误之前验证,将触发器插入到帖子中参考,但它似乎没有工作 【参考方案1】:如果您想使用触发器进行验证,您可以使用INSTEAD OF UPDATE,INSERT
触发器。
更多技术信息:https://technet.microsoft.com/en-us/library/ms179288(v=sql.105).aspx
【讨论】:
试过了,但上面的触发器给了我一个关于将空值转换为 int64 的错误以上是关于SQL Server 触发器在插入表之前验证数据的主要内容,如果未能解决你的问题,请参考以下文章