注册 登录
编程论坛 SQL Server论坛

保存点不会用

诸葛修勤 发布于 2011-05-16 14:58, 1021 次点击
程序代码:
BEGIN TRANSACTION;
INSERT INTO ContactReason VALUES ('1001', '////');
INSERT INTO ContactReason VALUES ('1002', '????');
SAVE TRANSACTION savapoint_cc;
DELETE ContactReason WHERE ContactReason = 'yxf';
ROLLBACK TO SAVEPOINT savapoint_cc;
DML都是没有问题的
就是想问下最后那句怎么用
13 回复
#2
lxd09802011-05-16 18:28
ROLLBACK TO SAVEPOINT savapoint_cc;
这一句是程序运行之前,就搞了一个保存点.当你执行上面的语句时,就会自动返回到你的设置的保存点的状态.
#3
诸葛修勤2011-05-16 18:50
回复 2楼 lxd0980
/*------------------------
BEGIN TRANSACTION;
INSERT INTO ContactReason VALUES ('1001', '////');
INSERT INTO ContactReason VALUES ('1002', '????');
SAVE TRANSACTION savapoint_cc;
DELETE ContactReason WHERE ContactReason = 'yxf';
ROLLBACK TO SAVEPOINT savapoint_cc;
------------------------*/
消息 156,级别 15,状态 1,第 6 行
关键字 'TO' 附近有语法错误。
#4
诸葛修勤2011-05-16 18:54
程序代码:
/*------------------------
INSERT INTO ContactReason VALUES ('1001', '////');
INSERT INTO ContactReason VALUES ('1002', '????');
DELETE ContactReason WHERE ContactReason = 'yxf';
------------------------
*/

(1 行受影响)

(1 行受影响)

(0 行受影响)
是不是ROLLBACK这句写错啦???
#5
lxd09802011-05-16 19:08
我不知道你要做什么, 反正我所知道的我是;  在你进行某项操作时,可以害怕操作失误, 那么你一开始就创建一个保存点,我叫它闪存, 再进行操作你想要你操作的,当你感觉操作错误的时候,你就可以使用这个保存点来恢复你到设置保存点的状态了, (打个比方,我们电脑装系统,装完之后,会搞一个备份,(呵呵,至少我是这样搞的),当你的系统运行很慢的时候,你就可以使用这个备份了,进行恢复,恢复到你装系统时的状态.)
不知道我说清楚了没有了.
#6
诸葛修勤2011-05-16 19:52
首先:我可以理解

但是在我的
只有本站会员才能查看附件,请 登录
上面运行 就是有错误
现在不明白 为什么会有错误
#7
诸葛修勤2011-05-16 19:56
像这样:
程序代码:
SELECT * FROM ContactReason;

BEGIN TRAN;
INSERT INTO ContactReason VALUES ('123', 'yyy');
SELECT * FROM ContactReason;
ROLLBACK;

SELECT * FROM ContactReason;
执行的结果:

只有本站会员才能查看附件,请 登录


这样子可以正确

所以现在就是问1楼的怎么会有错误  不知道现在说清楚没有
#8
lxd09802011-05-16 21:28
看来你是需要INSERT 触发器的知识.建议看看... 一两句说不清.
#9
诸葛修勤2011-05-16 22:01
。。。。
从头来过吧
假设什么都ok
现在在某个数据库当中
USE <database_name>
GO
存在ContactReason这样一张表
CREATE TABLE ContactReason
(
    ContactReason NVARCHAR(10),
    Description NVARCHAR(40),
    CONSTRAINT pk_contactreason PRIMARY KEY (ContactReason)
);
声明:上面标色的都没有问题 包括下面的DML语句也是没有问题的(即单独拿出来时可以的)

现在要问的问题:
第一 下面这段代码中有没有错误(主要是最后那句) ?
第二  如果没有错误是不是很有可能是我的运行环境不支持这样子的写法 ?
总结下: 如果不是语句本身的问题 引起我上面截图上的错误的可能性是什么?

BEGIN TRANSACTION;
INSERT INTO ContactReason VALUES ('1001', '////');
INSERT INTO ContactReason VALUES ('1002', '????');
SAVE TRANSACTION savapoint_cc;
DELETE ContactReason WHERE ContactReason = 'yxf';
ROLLBACK TO SAVEPOINT savapoint_cc;
#10
lxd09802011-05-17 11:19
说句实话,我找了一下资料,没有找到关于SQL创建保存点的方法。按理你的思想,你可以用触发器实现它。
#11
lxd09802011-05-17 11:25
我在oracle 里试了下,是可以的。
只有本站会员才能查看附件,请 登录
#12
诸葛修勤2011-05-17 18:35
改动了下 这样行
程序代码:
USE master
GO

CREATE TABLE ContactReason
(
    ContactReason NVARCHAR(10),
    Description NVARCHAR(40),
    CONSTRAINT pk_contactreason PRIMARY KEY (ContactReason)
);

INSERT INTO ContactReason VALUES ('yxf', 'hhhhhhh');

BEGIN TRAN;
SELECT * FROM ContactReason;
INSERT INTO ContactReason VALUES ('1001', '///////');
INSERT INTO ContactReason VALUES ('1002', '???????');
SELECT * FROM ContactReason;
SAVE TRAN savepoint_first;
DELETE ContactReason WHERE ContactReason = 'yxf';
SELECT * FROM ContactReason;
ROLLBACK TRAN savepoint_first;
SELECT * FROM ContactReason;

DROP TABLE ContactReason;
GO

 
#13
诸葛修勤2011-05-17 18:37
看来是我开始的那条语句写错啦
#14
lxd09802011-05-17 21:45
哦,这样了,感谢分享了.
1