只有选择权限也能锁表?阅读和选择

  

有个客户问我说,为啥只有选择权限,也可以更新锁表。

  

我懵了一下,不确认啊,我先测试了下,如下所示:

  

,创建用户test11 test11确认;   

  

,创建用户test12被test12;

  

格兰特连接、资源test11 test12;   

  

test11创建表。对象作为select * from dba_objects;

  

格兰特选择alt="只有选择权限也能锁表?阅读和选择“>

     

会话2:

  

  只有选择权限也能锁表?阅读和选择“> </p>
  
  <p>可以看的到,确实仅有可读的权限下,是可以更新的。</p>
  <p>为啥可以更新,似乎不符合逻辑,点太小了,只能在官方文档那个上搜了,不得不夸一句,甲骨文官方文档真的详细。只能想着在官方文档上看看有没有线索,一查,发现还真有! </p>
  </p> <p>如下:
  
  <p>
  <代码>选择</代码>,,,,,查询的表
  <代码>选择</代码>声明,包括
  <代码>选择</代码>…
  <代码> </代码>
  <代码>更新</代码>。</p>
  <p>可以看到,选择确实包含了更新权限。</p>
  
  <p>不一样的是,除了选择之外,还有一个读表示查询,但读是不包含更新。这个是12.1之后才有的变化。</p>
  <p>
  <强>
  读<代码> </代码> </强>查询的表
  <代码> </代码>选择语句。不允许
  <代码>选择</代码>…
  <代码> </代码>
  <代码>更新</代码>。</p>
  <p>
  此特权从Oracle数据库可用12
  版本1 (12.1.0.2). </p>
  
  <p>为啥选择会有更新权限呢,可能是出于希望查询能够强制一致性的关系。</p>
  <p>但这个其实对于大多数查询场景来说,更新的锁表权限还是太大了,所以在12.1开始,分离除了更小的阅读权限,用以满足客户需求。</p><h2 class=只有选择权限也能锁表?阅读和选择