SQL SERVER这样的触发器怎么写?

在订单表里新增一个触发器,监测每笔打款,最后一笔打款金额的打款时间回写到订单的资金到账时间里

字段如下:t_contract_order 订单表
discount_money 总金额
pay_money 已付金额
extend191 资金到账时间
PAY_FACT_DATE 打款时间
这边因为他可能不一定一次付清,所以会有多次。所以要将打款时间倒序排列出,取第一个值(也就是最后一次打款时间)

7个回答

create TRIGGER test
ON t_contract_order
AFTER UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
declare @id int
if UPDATE(pay_money)
begin
select @id=id from inserted
if exists(select id from t_contract_order where id=@id and discount_money=pay_money)
begin
update t_contract_order set extend191=PAY_FACT_DATE where id=@id
end
end
-- Insert statements for trigger here

END
GO

zwl_zwl_123456
zwl_zwl_123456 回复qq_39372401: 打款记录是在另外一张表里?
接近 2 年之前 回复
qq_39372401
qq_39372401 还有一个,就是他可能分批打款,所以要把打款时间倒序排列,然后取第一个
接近 2 年之前 回复

我觉得你应该先说一下怎么定义最后一笔

qq_39372401
qq_39372401 不用管啊,我只要看打款金额和总金额比较就行了。不用管是不是最后一笔啊
接近 2 年之前 回复

create TRIGGER test
ON t_contract_order
AFTER UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
declare @id int
if UPDATE(pay_money)
begin
select @id=id from inserted
if exists(select id from t_contract_order where id=@id and discount_money=pay_money)
begin
update t_contract_order set extend191=PAY_FACT_DATE where id=@id
end
end
-- Insert statements for trigger here

END
GO

Oracle trigger:

CREATE OR REPLACE TRIGGER "ORDERS_UPDATE_TRIG"
BEFORE UPDATE ON t_contract_order REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
DECLARE

BEGIN

IF UPDATING ('pay_money')
THEN
:NEW.PAY_FACT_DATE := sysdate;
END IF;
END ORDERS_UPDATE_TRIG;

以下是例程
定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。
常见的触发器有三种:分别应用于Insert , Update , Delete 事件。(SQL Server 2000定义了新的触发器,这里不提)

我为什么要使用触发器?
比如,这么两个表:
Create Table Student( --创建学生表
StudentID int primary key, --学号,定义主键约束
....
)

Create Table BorrowRecord( --创建借书记录表
BorrowRecord int identity(1,1), --自动增长流水号
StudentID int , --学号
BorrowDate datetime, --借出时间
ReturnDAte Datetime, --归还时间
...
)

用到的功能有:
如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);

这时候可以用到触发器。对于1,创建一个Update触发器:

Create Trigger truStudent
On Student

for Update --触发器类型--Update

--Name:truStudent
--func:更新BorrowRecord 的StudentID,与Student同步。
--Use :None
--User:System
--Author: wp_love
--Date : 2003-4-16

--Memo : 临时写写的,给大家作个Sample。没有调试阿。

As
if Update(StudentID)
begin

Update BorrowRecord
Set br.StudentID=i.StudentID
From BorrowRecord br , Deleted d ,Inserted i
Where br.StudentID=d.StudentID

end

理解触发器里面的两个临时的表:Deleted , Inserted 。注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。
一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted表,然后删除Student记录并写入新纪录。

新建一个表,每次打款都触发该表清空数据并添加打款金额的打款时间回写到订单的资金到账时间里

这个只能给你个思路,因为我之前也做过这样的操作,但是表结构是订单对应多条记录表。。。每一笔都是一个叠加,把这个叠加的值就是已经回款的值跟总金额做比较,如果大于等于总金额,那就执行你的操作。。还有一个就是触发器虽然好用方便,但是报错的时候很抓狂,建议在程序后台做处理

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!