有个客户问我说,为啥只有select权限,也可以for update锁表。
网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、重庆小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了全州免费建站欢迎大家使用!
我懵了一下,不确认啊,我先测试了下,如下所示:
create user test11 identified by test11;
create user test12 identified by test12;
grant connect,resource to test11,test12;
create table test11.objects as select * from dba_objects;
grant select on test11.objects to test12;
会话1:
会话2:
可以看到,确实仅有可读的权限下,是可以for update的。
为啥可以for update,似乎不符合逻辑,点太小了,只能在官方文档那个上搜了,不得不夸一句,oracle官方文档真的详细。只能想着在官方文档上看看有没有线索,一查,发现还真有!
如下:
SELECT
Query the table with the
SELECT
statement, including
SELECT
...
FOR
UPDATE
.
可以看到,select确实包含了 for update权限。
不一样的是,除了select之外,还有一个read表示查询,但是read不包含 for update。这个是12.1之后才有的变化。
READ
Query the table with the
SELECT
statement. Does not allow
SELECT
...
FOR
UPDATE
.
Note: This privilege is available starting with Oracle Database 12 c Release 1 (12.1.0.2).
为啥select会有for update权限呢,可能是出于希望查询能够强制一致性的关系。
但这个其实对于大多数查询场景来说,for update的锁表权限还是太大了,所以在12.1开始,分离除了更小的read权限,用以满足客户需求。