更新触发器SQL Server
问题描述:
我有两个表叫它Table_A和Table_B。我想创建一个触发器,使得每当表-A的payment
字段更新的新纪录应该插入表-B显示之前支付的价款和总支付量之差了。这两个表都低于:更新触发器SQL Server
表-A
A_id | payment |
1 | 1000 |
2 | 200 |
表-B
B_id | difference |
我触发的执行如下。我不确定如何计算这个差异:
CREATE TRIGGER trigger_Difference
ON Table_A
FOR UPDATE
AS
BEGIN
DECLARE @Difference as INT
DECLARE @PreviousDiff as INT
BEGIN
SELECT @PreviousDiff = SUM(payment)
FROM Table_A
END
if update(payment)
BEGIN
SELECT @Difference = ***don't know what to put here***
FROM inserted
INSERT INTO Table_B (difference) VALUES (@Difference)
END
END
答
此问题的另一个解决方案是使用OUTPUT子句在存储过程中该做的更新或只是适应这种方法您的需求。
IF OBJECT_ID('TABLE_A') IS NOT NULL DROP TABLE TABLE_A
IF OBJECT_ID('TABLE_B') IS NOT NULL DROP TABLE TABLE_B
IF OBJECT_ID('sp_Payment_Update') IS NOT NULL DROP PROC sp_Payment_Update
GO
CREATE TABLE TABLE_A (
A_ID INT IDENTITY(1,1),
Payment INT
)
CREATE TABLE TABLE_B (
B_ID INT ,
OldPayment INT,
NewPayment INT
)
GO
INSERT INTO TABLE_A VALUES (1000),(1200)
GO
CREATE PROC sp_Payment_Update
@A_ID INT,
@Payment INT
AS BEGIN
UPDATE TABLE_A
SET Payment = @Payment
OUTPUT
INSERTED.A_ID,
DELETED.Payment,
INSERTED.Payment
INTO TABLE_B
WHERE A_ID = @A_ID
SELECT * FROM TABLE_A
SELECT * FROM TABLE_B
END
GO
EXEC sp_Payment_Update 1, 1500
更新代码本身将记录你与它表-B发生了许多变化,你也可以把UpdateDate列表-B与GETDATE的默认值(),使其更加翔实。
提示:*在添加此付款之前的总付款金额*与*添加此付款金额之间的差额等于恰好一次付款,即最近一次付款。 – 2014-10-26 17:35:05
你的触发器有** MAJOR **缺陷,你似乎认为它会被称为每行**一次** - 这是**不是**的情况。触发器将在每个语句**中触发一次**,所以如果你的UPDATE语句影响了25行,你将触发**触发**一次,但是,然后“插入”和“删除”将分别包含25行。您的代码在这25行中选择哪一个:SELECT @Difference = .... FROM插入 - 它是非确定性的。你需要重写你的触发器来考虑这个问题! – 2014-10-26 17:44:16