pg資料庫有雷鋒?使用者已有許可權為何無故消失?

2021-09-22 07:17:10 字數 1601 閱讀 8585

越來越多的網際網路企業在使用postgresql資料庫,我們也不例外。接下來分享乙個反覆授權排查許可權消失的案例。

發現問題

昨天開發請我建立了乙個唯讀使用者abc_tmp_test使用者,並且將mkl_rw使用者下的32個表授權給唯讀使用者用。ok,請簡單輕鬆的乙個需求,很快就完成了。

但是今天開發來和我說,昨天授權的幾個表中,有部分表還是沒有許可權去讀取,讓我幫忙看看。

排查問題

第一次授權

一開始,我以為是昨天遺漏了,先道了乙個歉,再次進行了授權,授權完成之後,檢查了32個表,都能被唯讀使用者查詢,於是放心的告訴開發,昨天的所有表都已經授權好了,我也檢查過一次了。這次肯定不會漏了。

萬萬沒想到,半小時後,開發來和我說,不行,還是有其中幾個表沒有許可權。我之前的連線還沒斷開,再次跑了一遍之前的檢查語句,確實沒有許可權了。臥槽?這是咋回事?資料庫中有雷鋒了?

第二次授權

我再次授權了一次,並且檢查了information_schema.table_privileges,確認了再次授權後,是新增了32行記錄。這次我沒有先通知開發,說已經授權完成了,而是過了一會,我再次去查,變成了28行,又過了一會,變成了16行!

也就是我授權的32個表的select許可權給唯讀使用者,過一段時間之後,這32個表中的一些表的許可權會慢慢消失!而且消失許可權的表,也沒有發現先授權的先消失,後授權的後訊息的規律,但是可以發現最終剩下的,就是那16個表。我開始懷疑起人生了……

難道是pg中授權的表的數量有限?不能超過16個?也沒查到相關的引數啊。

難道是那16個表有什麼特殊設定?從建表語句中也沒看到啊。

難道授權之後需要checkpoint刷盤?測試了checkpoint還是一樣丟許可權。

難道真的有雷鋒出現啊。還說什麼pg和oracle一樣牛,一樣穩定,連基本的授權都會丟。

正在逐個檢查引數之際,同事通過檢查log,發現了drop table的語句……

測試模擬

原來如此,這個案例,可以用下面的測試過程模擬出來了:

是的,如果table被drop了之後,再次重建,此時原本授權給唯讀使用者的許可權,也會消失

向開發確認,是否有drop之後重建表的操作,開發確認,有段程式確實會定期的逐個drop表後重建表!!

為什麼要進行drop表之後重建表的操作?開發說是通過呼叫框架清理資料,框架就是這麼幹的。

ok,明白了目的是為了清理資料,而不涉及到表結構的修改,那麼其實用truncate來清理就可以了。如下測試,許可權不會丟。

最終,開發修改了**,再次授權那32張表之後,許可權不再慢慢消失了。

總結教訓

1. 大千世界無奇不有,資料庫中沒有雷鋒,而是有各種萬萬沒想到的邏輯。

2. 幸虧我們在建庫的時候,建庫標準要求設定了log_statement=ddl, 才能在log中發現線索。(其實我們oracle和pg的建庫標準,都設定了記錄ddl)

原文發布時間為:2018-01-24

資料和雲

Pg資料庫新增唯讀使用者。

今天pg資料庫需要新增乙個唯讀使用者,由於在pgadmin4中無法新增,遂用sql新增,遇到了乙個大坑,很基礎的問題,只怪自己學藝不精,一次提醒自己 注意 postgresql資料庫對大小寫不敏感!create user test2 with encrypted password test2 alt...

檢視MYSQL資料庫中所有使用者及擁有許可權

1.新建使用者。登入mysql mysql u root p 密碼 建立使用者 mysql insert into mysql.user host,user,password values localhost phplamp password 1234 重新整理系統許可權表 mysql flush ...

使用者 角色 許可權資料庫設計

分類 linux 許可權管理 許可權管理,主要是人員和許可權之間的關係,但是如果讓人員直接和許可權打交道,那麼許可權的賦值 許可權的撤銷以及許可權的變動會非常的麻煩,這樣引入了,角色,給角色賦許可權,然後給使用者分配角色。這個設計主要涉及6張表,使用者表,用於儲存使用者的所有資訊 許可權表,用於儲存...