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 触发器在插入表之前验证数据的主要内容,如果未能解决你的问题,请参考以下文章

创建触发器后的 SQL Server

sqlserver2005触发器问题

sqlserver,触发器做备份表如何插入当前时间?

sql server 数据库里设置了当插入数据时,便触发器插入更新时间,但我导入数据时,触发器却没有工作。

SQL Server表审核触发器

插入前的 SQL Server 触发器