【问题标题】:SQL Server trigger to validate data before insert on a tableSQL Server 触发器在插入表之前验证数据
【发布时间】:2023-03-03 21:02:01
【问题描述】:

我对 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

【问题讨论】:

  • 为什么要存储这个值?为什么不直接在需要的时候计算呢?
  • 嗨,戈登,我已经对我的原始帖子进行了编辑,实际上并不想将值存储在另一个表中,只是希望触发器在插入或引发错误之前验证,将触发器插入到帖子中参考,但它似乎没有工作

标签: sql sql-server triggers


【解决方案1】:

如果您想使用触发器进行验证,您可以使用INSTEAD OF UPDATE,INSERT 触发器。 更多技术信息:https://technet.microsoft.com/en-us/library/ms179288(v=sql.105).aspx

【讨论】:

  • 试过了,但上面的触发器给了我一个关于将空值转换为 int64 的错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
相关资源
最近更新 更多