更新触发器SQL Server
我有两张桌子叫它桌子A和桌子B。我想创建一个触发器,以便每当更新表a中的更新触发器SQL Server,sql,sql-server,tsql,database-trigger,Sql,Sql Server,Tsql,Database Trigger,我有两张桌子叫它桌子A和桌子B。我想创建一个触发器,以便每当更新表a中的付款字段时,应在表B中插入一条新记录,以显示以前付款总额与现在付款总额的差异。以下是两个表格: 表A A_id | payment | 1 | 1000 | 2 | 200 | 表B B_id | difference | 下面是我对触发器的实现。我不确定如何计算此差异: CREATE TRIGGER trigger_Difference ON Table_A FOR UPDATE AS BE
付款
字段时,应在表B中插入一条新记录,以显示以前付款总额与现在付款总额的差异。以下是两个表格:
表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中对其所做的更改,您也可以在表B中添加一个UpdateDate列,默认值为GETDATE(),以增加信息量 提示:添加此付款之前和添加此付款之后的付款总额之差正好等于一笔付款,即最近的一笔付款。您的触发器有一个主要缺陷,您似乎认为它每行调用一次-事实并非如此。每个语句触发一次触发器,因此如果
UPDATE
语句影响25行,您将触发一次触发器,但是Inserted
和Deleted
将分别包含25行。您的代码将在此处选择这25行中的哪一行:select@Difference=。。。。从插入的
-它是不确定的。你需要重写你的触发器来考虑这一点!