【发布时间】:2011-06-23 14:25:15
【问题描述】:
在 sqlplus 中,我可以创建一个只读事务。
set transaction read only;
是否可以创建只读会话?
我想连接到 Oracle 数据库,使用 UPDATE 和 INSERT 执行一些测试,但即使在整个会话期间执行提交也不提交它们。
【问题讨论】:
-
我不太清楚。你想允许 INSERT 和 UPDATE,但不允许提交?
在 sqlplus 中,我可以创建一个只读事务。
set transaction read only;
是否可以创建只读会话?
我想连接到 Oracle 数据库,使用 UPDATE 和 INSERT 执行一些测试,但即使在整个会话期间执行提交也不提交它们。
【问题讨论】:
你可以看看下面的
CREATE TABLE dummy
(val NUMBER(1)
CONSTRAINT dummy_ck CHECK(val =1) DEFERRABLE INITIALLY DEFERRED)
/
insert into dummy VALUES (2);
..<bits here>..
commit;
除非实际从 DUMMY 中删除/更新挂起的条目,否则事务将在 COMMIT 时失败并自动回滚。如果是
INSERT....
COMMIT...
INSERT....
然后第一次提交将触发失败/回滚,因此第二次将成功。所以它很丑陋,也不是特别安全。但它可能适合您的需求
【讨论】:
您的问题的简短回答是否定的,您不能创建“只读会话”。
如果您对表具有仅 SELECT 权限,然后发出 UPDATE/INSERT/DELETE 语句,则会出现“权限不足”错误。
你也不能在只读事务中发出 UPDATE/INSERT/DELETE 语句,你会得到一个错误。我认为这意味着您认为您使用“只读设置事务”所做的事情不会像我理解的那样做。以下是真正会发生的事情:
SQL> set transaction read only;
Transaction set.
SQL> update tbl set code = 'ACTIVE' where id = 10;
update tbl set code = 'ACTIVE' where id = 10
*
ERROR at line 1:
ORA-01456: may not perform insert/delete/update operation inside a READ ONLY transaction
SQL>
对于您的测试,您应该:
【讨论】:
为此,我们创建一个具有只读权限的新用户。
【讨论】: