有個客戶問我說,為啥只有select權限,也可以for update鎖表。
網站建設哪家好,找創(chuàng)新互聯(lián)!專注于網頁設計、網站建設、微信開發(fā)、重慶小程序開發(fā)、集團企業(yè)網站建設等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了全州免費建站歡迎大家使用!
我懵了一下,不確認啊,我先測試了下,如下所示:
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官方文檔真的詳細。只能想著在官方文檔上看看有沒有線索,一查,發(fā)現(xiàn)還真有!
如下:
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權限呢,可能是出于希望查詢能夠強制一致性的關系。
但這個其實對于大多數(shù)查詢場景來說,for update的鎖表權限還是太大了,所以在12.1開始,分離除了更小的read權限,用以滿足客戶需求。