問題描述
客戶生產環境出現權限丟失的現象,溝通后得知,情況如下,用戶B對用戶A的tab1表有查詢權限,某天,開發人員對用戶A的tab1表添加索引IDX_XXX后,索引添加成功,同時用戶B對用戶A的tab1表查詢權限也被收回,開發人員很確定,只操作了添加索引命令,并沒有操作收回權限命令,類似情況出現2次,問題十分詭異,需要介入排查。
環境信息:
主機環境:Oracle Linux Server release 6.10
數據庫:Oracle 11.2.0.4.180717 RAC
問題分析
與開發人員溝通,了解操作的具體步驟,以及操作表的詳細信息,提取關鍵信息,如下:
1、表tab1上有主鍵,且新建索引IDX_XXX有3個字段,主鍵字段包含在內
2、開發人員通過PL/SQL Developer三方客戶端工具,在表上通過編輯表,圖形化操作添加主鍵
對溝通結果進行分析,可能出現的原因:
1、Oracle 自身BUG造成,需要進行驗證
2、開發人員可能進行誤操作,概率比較小,因出現過2次
3、PL/SQL Developer三方客戶端工具BUG,操作了預期之外的命令
針對以上問題需要逐個驗證。
信息追溯
通過和開發人員溝通,了解了問題的表象,作為一名數據庫管理員,需要對信息進行再次認證,通過對數據庫信息的搜集,得到2個有效信息。
表對象和索引修改時間
在11點13分32秒確實有創建索引操作,但是在11點13分38秒,表也有相關DDL操作,通過DDL時間可以得知。
注:表的LAST_DDL_TIME可以通過很多途徑更新,比如添加/刪除字段、添加字段comment,授權/收回權限等。

歸檔日志解析
數據庫歸檔日志記錄著幾乎所有數據庫的更新操作,通過解析歸檔日志,得到了更有效的信息,在創建索引之后,數據庫隨機進行了收回權限的操作,證實了,收回權限是命令觸發的,至于命令是數據庫自己生成,還是其他原因造成需要進行驗證。

實踐驗證
既然無法確認是那種情況造成,那就親自實踐。
使用sqlplus進行驗證
通過Oracle 原生的sqlplus并沒有復現問題
1,創建測試用用戶,并賦予權限。
root:
create user zsdba1 identified by 123456;
grant dba to zsdba1;
create user zsdba2 identified by 123456;
grant connect to zsdba2;
2,創建測試用表
conn zsdba1:
create table test001 (id number,name varchar2(20),age number);
alter table TEST001 add constraint PK1 primary key (ID);
3,目前由于沒有賦予select權限,zsdba2無法訪問zsdba1的test001.
conn zsdba2/123456:
select * from zsdba1.test001;
*
ERROR at line 1:
ORA-00942: table or view does not exist
4. 賦予zsdba2對zsdba1表的訪問權限。
conn SYS:
GRANT SELECT ON zsdba1.test001 TO zsdba2;
5. 可以訪問。
conn zsdba2/123456:
SQL> select * from zsdba1.test001;
no rows selected
6. 添加索引
conn zsdba1:
SQL> create index idx_test001 on test001(id,age);
Index created.
7. 訪問沒有問題,問題不再現
conn zsdba2/123456:
SQL> select * from zsdba1.test001;
no rows selected
使用PL/SQL Developer進行驗證
1.創建測試表T_OBJECT1033
2.添加主鍵
alter table T_OBJECT1033add constraint PK333 primary key (OBJECT_ID);
3.授權
grant select on T_OBJECT1033 to zsdba2;
4.接下來一步比較重要
通過PL/SQL Developer進行一下操作



此時發現,PL/SQL Developer竟然生成一條收回權限的操作,經過幾輪的測試,問題均會復現,至此,權限丟失的問題原因已經找到。
而且經過測試發現,每個表這種情況只會出現一次,就是說,第二次添加索引就不會有這種現象。
結論
通過以上的分析,實踐驗證,最終問題定位于PL/SQL Developer工具問題(可能BUG),與開發人員溝通,調整操作習慣,統一使用命令行添加索引。




