问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

SQL 触发器与事务

发布网友 发布时间:2022-04-11 15:25

我来回答

2个回答

热心网友 时间:2022-04-11 16:54

触发器里面 ROOLBACK 就可以了

CREATE TABLE Goods(
id INT,
Amount INT
);

CREATE TABLE OrderDetail(
ID INT,
GoodsID INT,
Amount INT
);

INSERT INTO Goods VALUES (1, 100);

EXEC sp_addmessage 60005, 16,
@msgtext = N'Not Goods to use.',
@lang = 'us_english'
go
EXEC sp_addmessage 60005, 16,
@msgtext = N'库存不足',
@lang = '简体中文'
go

create trigger trgAfterOrder
on OrderDetail
for insert
as
begin
declare
@cGoodsID as int,
@iAmount as int,
@nowCount as INT

select @cGoodsID = GoodsID, @iAmount = Amount
from inserted

SELECT @nowCount = Amount
FROM Goods
where ID = @cGoodsID;

IF @nowCount - @iAmount < 0
BEGIN
RAISERROR(60005, 16, 1);
ROLLBACK;
END
ELSE
BEGIN
update Goods
set Amount = Amount - @iAmount
where ID = @cGoodsID
END
end

----
1> select * from goods;
2> go
id Amount
----------- -----------
1 100

(1 行受影响)
1> select * from OrderDetail;
2> go
ID GoodsID Amount
----------- ----------- -----------

(0 行受影响)

1> INSERT INTO OrderDetail VALUES(1, 1, 90);
2> go

(1 行受影响)
1> INSERT INTO OrderDetail VALUES(1, 1, 20);
2> go
消息 60005,级别 16,状态 1,服务器 HOME-BED592453C\SQLEXPRESS,过程 trgAfterOrd
er,第 21 行
库存不足
消息 3609,级别 16,状态 1,服务器 HOME-BED592453C\SQLEXPRESS,第 1 行
事务在触发器中结束。批处理已中止。

1> select * from goods;
2> go
id Amount
----------- -----------
1 10

(1 行受影响)
1> select * from OrderDetail;
2> go
ID GoodsID Amount
----------- ----------- -----------
1 1 90

(1 行受影响)
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
玉米仁子饭产自哪里 中国期货交易所的交易品种有哪些? 历史要怎么读,有啥诀窍 高中历史诀窍 年终会活动策划方案 深度解析:第一财经回放,探索财经新风向 逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? 关于SQL Server里的两个问题(触发器和事务),请大侠们教教小弟! c++中怎么强制关闭死锁进程 系统进程死锁的预防措施有什么 死锁的排除方法 处理死锁的方法 sqlserver2008r2 死锁 DB2 SQL Error: SQLCODE=-880, SQLSTATE=3B001, SQLERRMC=&quot;JCC_GENENERATED_NAME_194&quot;, DRIVER=4.16.53 - DB2 SQL error: SQLCODE: -727, SQLSTATE: 56098, SQLERRMC: 2;-401;42818;= DB2 SQL Error: SQLCODE=-727, SQLSTATE=56098, SQLERRMC=2;-204;42704;XINGHUO.USER db2 执行sql 报sqlcode =-973,sqlstate=57011,sqlerrmc= DB2 SQL0104N An unexpected token &quot;END-OF-STATEMENT&quot; was found SQLSTATE=42601 SQLCODE=-104 DB2 sqlstat57016 原因码“3异常有哪位高手能解决 com.ibm.db2.jcc.b.SqlException: DB2 SQL error: SQLCODE: -1585, SQLSTATE: 54048, com.ibm.db2.jcc.a.SqlException: DB2 SQL error: SQLCODE: -973, SQLSTATE: 5701 DB2不允许对表“xx”执行操作,原因码为&quot;7&quot; error code 668 sql state 57016怎么处理 vb6.0获取sqlserver存储过程的返回值 SQLServer 怎样在存储过程中获取另一个存储过程的部分执行结果集 sqlserver怎么获取存储过程的返回值 如何安装 SQL Server 2012 事务与触发器有什么区别? 关于触发器和事务? sql server 怎么创建创建列唯一约束,不是写sql语句 SQL Server创建 学号 性别 课程编号 check约束 主键约束 UNIQUE约束 请问下在sql server中,我创建约束的时候没有定义约束名,它默认的约束名是什么呀? SQL server 中创建主键约束为什么说已定义主键 delphi中怎么获取服务器的时间,从数据库中获取 sql 中inner join和left join的区别 SQLServer多表join问题 SQL from多表和 inner join的区别 不带join的连接查询和带join连接查询有什么差异 SQLServer 初级问题 帮忙讲解一下sqlserver中查询语句关联的意思。 SQL两个表的连接 win10 64位怎么安装sql2000 怎么在win10中安装sql2000 win10 64位安装sql2000 64位windows10下怎样装mssql2000l sql2000 personal win10怎么安装 Win10系统无法安装sql2000怎么办 win10安装sql2000的正确方法