如何在数据库中撤消更新?(100分)

M

myname

Unregistered / Unconfirmed
GUEST, unregistred user!
我用D4编了一个三层结构的程序, 数据库用SQL-SERVER6.5, 并用了
大量触发器来保证数据的完整性, 如果输入的数据不合要求, 则用
"rollback tran" 撤消这次操作, 但在运行中却总是出错, 错误
信息如下:
No user transaction is currently in progress.
The rollback transaction request has no corresponding begin

TRANSACTION
触发器示例如下:
Create trigger on Mytable For UPDATE AS
IF @@ROWCOUNT=0
RETURN
IF DATEDIFF(hh,开始时间,结束时间)>60
begin
ROLLBACK TRAN *这一句出错*
RAISERROR('时间输入不对,操作中止',16,1)
RETURN
END
GO

我查了很多这方面的资料, 在触发器是可以用rollback tran
来撤消当前操作的, 我跟踪了BDE的SQL语句, 在Update语句前
又有“begin
tran”。
不知在触发器中如何撤消当前操作, 请各位大侠多请教.
 
服务器端的判断语句,我不太清楚。我知道在delphi总是可以判断的。
例如:
if not database1.intransaction then
database.starttransaction;
 
非常感谢你的回答, 我上述触发器的校验确实可以在应用程序
服务器进行, 但我还有几个校验要复杂得多, 必须在触发器中
进行。
另外, 我又进行了一些测试, 发现直接通过ISQL_W发出UPDATE
命令, 触发器工作非常正常, 但在DELPHI客户端修改数据后, 用
Applyupdate存盘时却出现上述错误,不知是何原因。
 
你应该在TRIGGER语句中加上begin
tran语句,而不止是只在delphi的语句加begin
TRAN语句,因为DELPHI的事务同SQL SERVER的事务是两个不同的事务,且DELPHI的事务
是罩在SQL SERVER的事务外.
另外,DELPHI的事务应尽量少用,因为他给SQL SERVER带来额外的日志
.
 
TDatabase.ApplyUpdate will automatic start a transaction
 
非常感谢二位的回答。我再说几句
Delphi的事件是BDE自动加上去的, 我并未加。
如果在触发器中加上“begin
Tran”, 则用“Rollback Tran”
只能撤消在触发器中的操作, 而引发触发器的操作并不能撤消. 而
我正需要撤消引发触发器的操作, 不知应怎么办。
 
是否可用 Delphi 构件 TDatabase 的事务处理:
Database1.StartTransaction;
Try
数据库操作;
。。。
Database1.Commit;
Except
Database1.RollBack;
end;
 
学生 is right
 
接受答案了.
 
顶部