Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更新触发器SQL Server_Sql_Sql Server_Tsql_Database Trigger - Fatal编程技术网

更新触发器SQL Server

更新触发器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

我有两张桌子叫它桌子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
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=。。。。从插入的
-它是不确定的。你需要重写你的触发器来考虑这一点!